重载 Prefix/Postfix 编译器优化

Overloaded Prefix/Postfix Compiler Optimization

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

例如,在下面的代码中,大多数编译器将 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("*");

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

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

在您的第二种情况下,假设未使用 returned 结果,编译器可以将值副本作为命名 return 值优化 (NRVO) 扩展的一部分进行优化。