是否允许编译器优化重载的后缀运算符并将其替换为前缀运算符? (假设编译器知道重载函数的作用)
例如,在以下代码中,大多数编译器将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("*");
答案 0 :(得分:4)
只要不改变代码的行为,就允许优化器执行任何。 (这称为the "as-if" rule。)
是的,在您的第一个代码段++i
中,i++
将在大多数编译器上针对相同的内容进行优化。 (虽然曾经不是这种情况,这就是为什么像我这样的老猫仍在++i
循环中使用for
的原因。)
在第二种情况下,编译器可以优化值复制,作为命名返回值优化(NRVO)扩展的一部分,假设未使用返回的结果。