是否可以优化“未使用”的对象?

时间:2016-07-28 15:00:34

标签: c++

在这样的代码中:

void foo() {
  SomeObject obj;
}

有人可能认为obj是“未使用”,因此可以进行优化,就像未使用的本地int一样。这对我来说似乎是一个错误,因为与int不同,SomeObject构造函数可能会有重要的副作用。所以,我想知道,语言是否明确要求这些局部变量不被优化掉?或者程序员是否必须采取预防措施来阻止这种优化?

3 个答案:

答案 0 :(得分:3)

如果编译器具有SomeObject::SomeObject()构造函数的定义并且SomeObject析构函数可用(即它们是否内联定义)并且可以看到没有副作用,那么是的,这个可以优化(如果您不对obj执行任何其他需要完全构建的内容。)

否则,如果构造函数是在另一个翻译单元中定义的,那么编译器就不会知道没有副作用,所以会调用(和析构函数一样,如果那不是内联)。

通常,编译器可以自由地执行任何不会改变程序语义的优化。在这种情况下,删除一个未使用的局部变量,其构造函数和析构函数不会触及任何其他代码,这不会改变程序的含义,因此它非常安全。

答案 1 :(得分:2)

首先,让我们更正这个例子:

void foo() {
  SomeObject obj; // not obj()
}

其次,' as-if'规则适用于优化器。因此,可能优化整个对象,但是,必须显示构造函数/析构函数(包括基类)的所有副作用。这意味着您可能最终不使用额外的内存(只要您不使用obj的地址),但是您的构造函数/析构函数( s)仍然会运行。

答案 2 :(得分:0)

是。现代编译器非常擅长删除死代码(假设您在启用优化的情况下构建)。这包括未使用的对象 - 如果构造函数和析构函数没有副作用,并且编译器可以看到(例如;它没有隐藏在库中)。