为什么编译器不优化这个呢?

gez*_*eza 12 c++ gcc clang

看看这段代码:

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());
}
Run Code Online (Sandbox Code Playgroud)

Object::m_initTypeconst一样,它在构造函数之后不会改变.因此,理论上,在编译器callInitAcallInitB,在编译器中,它知道内m_initType联时的值~Object().但是,gcc和clang都无法应用此优化,并且都检查了值m_initType.

这是为什么?是否有一些针对此优化的语言规则,或者编译器只是不进行这种优化?

(这个问题与密切相关,但这是一个更具体的问题,我希望我能得到答案)

Non*_*ame 0

对象析构函数在您的示例中未内联,并且您有 2 个调用,其中一个 m_initType 为 1,另一个为 0。因此编译器必须支持这两个版本。另外,我认为您的实际代码比您的示例更复杂,因此编译器可能会认为内联整个析构函数代码比保留带有单个“if”的通用版本更昂贵。