重载的前缀/后缀编译器优化

时间:2017-01-25 13:36:17

标签: c++ operator-overloading 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("*");

1 个答案:

答案 0 :(得分:4)

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

是的,在您的第一个代码段++i中,i++将在大多数编译器上针对相同的内容进行优化。 (虽然曾经不是这种情况,这就是为什么像我这样的老猫仍在++i循环中使用for的原因。)

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