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

C++的评估顺序和排序前和编译器的重新排序?

  •  2
  • ricky  · 技术社区  · 7 年前

    Order of evaluation ,我不太明白。顺序是指运行时的执行顺序还是源代码中的逻辑顺序?

    让我们看一段代码片段,如下所示:

    void f()
    {
       int a = 10; // A
       int b = 20; // B
       //...
    }
    

    A 是在表达式之前排序的 B ?

    C++编译器允许重新排序代码吗?

    void f()
    {
       int b = 20; // B
       int a = 10; // A
        //...
    }
    

    B 之前是按顺序排列的 ?

    1 回复  |  直到 7 年前
        1
  •  5
  •   aaaaaa123456789    7 年前

    一般来说,编译器可以执行以下操作 有什么事吗

    事实上,您的典型C/C++编译器在启用任何合理的优化标志的情况下,给出了如下函数:

    void f (void) {
      int a = 20;
      int b = 10;
    }
    

    将其编译为:

    f:
      ret
    

    换句话说,它将把它当作一个空函数。原因是该功能没有任何影响;这些变量已分配给,但从未使用过它们的值(在技术术语中,它们是 死库

    void foo (int num, int * num2, int * num3) {
      *num2 = num * 2;
      *num3 = num * 3;
    }
    

    编译器可以重新排列这些语句吗?答案是坚定的 号码 . 原因是 num2 和 num3 foo(3, &bar, &bar) )因此,写作的顺序很重要。另一方面,仅使用C(而不是C++),我们可以这样编写:

    void foo (int num, int * restrict num2, int * restrict num3) {
      *num2 = num * 2;
      *num3 = num * 3;
    }
    

    那么 restrict