重载 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。)
所以是的,在你的第一个片段中,++i
和 i++
将在大多数编译器上优化为相同的东西。 (虽然以前不是这样,这就是为什么像我这样的老猫仍然在 for
循环中使用 ++i
。)。
在您的第二种情况下,假设未使用 returned 结果,编译器可以将值副本作为命名 return 值优化 (NRVO) 扩展的一部分进行优化。
是否允许编译器优化重载的后缀运算符并将其替换为前缀运算符? (前提是编译器 知道 重载函数的作用)
例如,在下面的代码中,大多数编译器将 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。)
所以是的,在你的第一个片段中,++i
和 i++
将在大多数编译器上优化为相同的东西。 (虽然以前不是这样,这就是为什么像我这样的老猫仍然在 for
循环中使用 ++i
。)。
在您的第二种情况下,假设未使用 returned 结果,编译器可以将值副本作为命名 return 值优化 (NRVO) 扩展的一部分进行优化。