在这样的代码中:
void foo() {
SomeObject obj;
}
有人可能认为obj
是“未使用”,因此可以进行优化,就像未使用的本地int
一样。这对我来说似乎是一个错误,因为与int
不同,SomeObject
构造函数可能会有重要的副作用。所以,我想知道,语言是否明确要求这些局部变量不被优化掉?或者程序员是否必须采取预防措施来阻止这种优化?
答案 0 :(得分:3)
如果编译器具有SomeObject::SomeObject()
构造函数的定义并且SomeObject
析构函数可用(即它们是否内联定义)并且可以看到没有副作用,那么是的,这个可以优化(如果您不对obj
执行任何其他需要完全构建的内容。)
否则,如果构造函数是在另一个翻译单元中定义的,那么编译器就不会知道没有副作用,所以会调用(和析构函数一样,如果那不是内联)。
通常,编译器可以自由地执行任何不会改变程序语义的优化。在这种情况下,删除一个未使用的局部变量,其构造函数和析构函数不会触及任何其他代码,这不会改变程序的含义,因此它非常安全。
答案 1 :(得分:2)
首先,让我们更正这个例子:
void foo() {
SomeObject obj; // not obj()
}
其次,' as-if'规则适用于优化器。因此,可能优化整个对象,但是,必须显示构造函数/析构函数(包括基类)的所有副作用。这意味着您可能最终不使用额外的内存(只要您不使用obj的地址),但是您的构造函数/析构函数( s)仍然会运行。
答案 2 :(得分:0)
是。现代编译器非常擅长删除死代码(假设您在启用优化的情况下构建)。这包括未使用的对象 - 如果构造函数和析构函数没有副作用,并且编译器可以看到(例如;它没有隐藏在库中)。