看看這段代碼:編譯器爲什麼不優化?
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++應用此優化。有些是,有些則不是,優化者並不是平等的。 –