给定以下代码:
struct obj {
int i;
obj() : i(1) {}
obj(obj &&other) : i(other.i) {}
};
void f() {
obj o2(obj(obj(obj{})));
}
我希望发布版本只会真正创建一个对象,而不会调用移动构造函数,因为结果与执行我的代码一样。虽然大多数代码并不是那么简单,但我可以想到一些难以预测的副作用,这些副作用可能会阻止优化器证明“好像”:
- 在移动构造函数或析构函数中更改全局或“外部”事物。
- 移动构造函数或析构函数中的潜在异常(无论如何可能是糟糕的设计)
- 内部计数或缓存机制发生变化。
由于我不经常使用这些中的任何一个,我可以期待我的大部分进出函数,这些函数后来被内联优化掉还是我忘记了什么?
PS我知道仅仅因为可以进行优化并不意味着它将由任何给定的编译器进行。