代码之家  ›  专栏  ›  技术社区  ›  Suma

_uuu的一些例子假设在开关中导致比“无默认”更快的代码?

  •  8
  • Suma  · 技术社区  · 15 年前

    _uuu-assume的文档说“最常见的使用是switch语句的默认情况,如下例所示。”

    • 有没有其他情况下,_uuu假设可以导致更有效(甚至不同)的代码?
    • 当在if/else内部时,编译器是否会自动“假设”由于if条件已经知道的内容?

    我找不到任何可以展示上述任何一种的非平凡的例子——我希望其他人可以。

    1 回复  |  直到 11 年前
        1
  •  8
  •   vladr    11 年前

    考虑使用 /Ox 开关:

    if (1) {
      printf("live code\n");
    } else {
      printf("dead code\n");
    }
    

    优化器将优化 else . 现在考虑:

    int x = 1;
    if (x == 1) {
      printf("live code\n");
    } else {
      printf("dead code\n");
    }
    

    优化器将再次优化 其他的 . 还考虑:

    int x = 1;
    __assume(x != 1);
    if (x == 1) {
      printf("live code\n");
    } else {
      printf("dead code\n");
    }
    

    优化器将优化 if 这次——不正确。

    要测试,请在发布模式下构建测试程序(使用 /Zi 选项)并查看生成的程序集( Alt+8 在Visual Studio中。)

    现在考虑一下上面的内容 if/else 在内联方法中测试的条件。在某些上下文中,程序员可能知道内联方法是用特定的值调用的,优化器可能没有意识到这一点。使用 __assume 在调用方级别,按照上面所示的方式,在调用内联方法之前,理论上可以帮助优化器。

    Optimization Best Practices :

    假设在Visual C++中进行 多个版本,但它已经 在Visual C++ 2005中更有用。 通过假设,开发者可以判断 编译器对 某个变量的值。

    例如,假设(a<5);告诉 优化器在那一行代码 变量A小于5。阿盖恩 这是对编译器的承诺。如果 A在这一点上实际上是6 然后程序的行为 编译后的程序 优化可能不是你想要的 期待。_假设是最有用的 切换语句和/或 条件表达式。

    有一些限制 假设。首先,就像限制一样,它只是一个建议,所以编译器 可以忽略它。同时,假设 当前仅适用于变量 对常数的不等式。它 不传播符号 例如,不平等假设(a< b)。