【问题标题】:Overloaded Prefix/Postfix Compiler Optimization重载前缀/后缀编译器优化
【发布时间】:2017-01-25 13:36:17
【问题描述】:

是否允许编译器优化重载的后缀运算符并将其替换为前缀运算符? (前提是编译器知道重载函数的作用)

例如,在以下代码中,大多数编译器将i++ 视为++i 并生成相同的程序集。

for(int i=0; i<5; i++)
    printf("*");

那么,下面的代码可以同样适用吗?

class Integer {
    int data;
    Integer& operator++() { ++data; return *this; }
    Integer operator++(int) { Integer ret = *(this); ++(*this); return ret; }
    // And more overloads...
};

for(Integer i=0; i<5; i++)
    printf("*");

【问题讨论】:

    标签: c++ operator-overloading compiler-optimization


    【解决方案1】:

    只要不改变代码的行为,优化器就可以做任何事情。 (这称为the "as-if" rule。)

    所以是的,在您的第一个 sn-p 中,++ii++ 将在大多数编译器上优化为相同的东西。 (虽然以前不是这样,这就是为什么像我这样的老猫仍然在forloop 中使用++i。)。

    在第二种情况下,假设返回的结果未被使用,编译器可以优化掉值副本作为命名返回值优化 (NRVO) 扩展的一部分。

    【讨论】:

      猜你喜欢
      • 2017-10-18
      • 1970-01-01
      • 2016-11-04
      • 2017-09-01
      • 2012-01-05
      • 2012-10-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多