看看这段代码:编译器为什么不优化?
struct Data {
};
struct Init {
Data *m_data;
Init() : m_data(new Data) { }
~Init() {
delete m_data;
}
};
class Object {
private:
const int m_initType;
Data *m_data;
public:
Object(const Init &init) : m_initType(0), m_data(init.m_data) { }
Object(Init &&init) : m_initType(1), m_data(init.m_data) { init.m_data = nullptr; }
~Object() {
if (m_initType==1) {
delete m_data;
}
}
};
void somefunction(const Object &object); // it is intentionally not defined
void callInitA() {
Init x;
somefunction(x);
}
void callInitB() {
somefunction(Init());
}
由于Object::m_initType
是常量,它不构造后更改。因此,理论上,在callInitA
和callInitB
中,编译器在内联~Object()
时知道m_initType
的值。但是,gcc和叮当fails to apply这个优化,并且都检查了值m_initType
。
这是为什么?有没有针对这种优化的语言规则,或编译器是不是做这种优化?
(这个问题是密切相关的this,但它是一个更具体的问题,我希望我能得到这个答案)
'Init g; void somefunction(Object object){object。〜Object();新(&对象)对象(g);}'也许? –
这是一个小得多的例子,我认为它演示了同样的问题:https://godbolt.org/g/zTyctM - 如果你注释掉'somefunction',那么整个事情就会被优化,但是'somefunction'被称为编译器生成一个“不可能发生”的检查。 –
MSVC++应用此优化。有些是,有些则不是,优化者并不是平等的。 –