【发布时间】:2013-02-23 21:19:55
【问题描述】:
给定以下代码:
struct obj {
int i;
obj() : i(1) {}
obj(obj &&other) : i(other.i) {}
};
void f() {
obj o2(obj(obj(obj{})));
}
我希望发布版本只真正创建一个对象,而从不调用移动构造函数,因为结果与 就像我的代码已执行一样。虽然大多数代码并不是那么简单,但我可以想到一些难以预测的副作用,这些副作用可能会阻止优化器证明“好像”:
- 在移动构造函数或析构函数中对全局或“外部”事物的更改。
- 移动构造函数或析构函数中的潜在异常(无论如何可能是糟糕的设计)
- 内部计数或缓存机制发生变化。
由于我不经常使用其中任何一个,我可以期望我的大部分进出函数,这些函数后来被内联优化掉还是我忘记了什么?
附:我知道仅仅因为可以进行优化并不意味着它将由任何给定的编译器进行。
【问题讨论】:
-
而不是希望
as-if消除,您可以摆脱std::move调用,并且复制省略可能会删除该代码中的每一个复制/移动(即使这些移动操作已经副作用)。 (as-if消除可能只是将o从程序中完全删除)。
标签: c++ optimization c++11 move