繁体   English   中英

是否允许C ++编译器优化未引用的本地对象

[英]Is C++ compiler allowed to optimize out unreferenced local objects

我使用以下类在某个函数的开头自动设置等待光标,并在函数返回时重置光标。

class WaitCursorSetter
{
public:
    WaitCursorSetter() {QApplication::setOverrideCursor(Qt::WaitCursor);}
    virtual ~WaitCursorSetter() {QApplication::restoreOverrideCursor();}
};

我在函数开始时创建一个本地WaitCursorSetter对象。 由于等待游标在对象的析构函数中被重置,因此当函数返回并且对象超出范围时,我不必在方法中的每个return语句之前重置游标,因为析构函数被调用。

如果编译器优化了未引用的WaitCursorSetter对象,则不起作用。 我的问题是,编译器是否允许优化此对象?

编译器不允许优化掉析构函数或initlization有副作用的自动对象,我们可以通过转到草案标准部分3.7.3来看到这一点:

如果具有自动存储持续时间的变量具有初始化或具有副作用的析构函数,则不应在其块结束之前销毁它,也不应将其作为优化消除,即使它看起来是未使用的,除了类对象或其复制/移动可以按照12.8的规定予以删除。

这样做是完全安全的。 事实上,在实践RAII时,它是一种经常使用的技术。 编译器不会优化任何具有非平凡构造函数或析构函数的局部变量。 看看C ++中什么是非平凡的构造函数

要避免编译器警告有关未使用的局部变量,可以使用Q_UNUSED宏。

如果您可以观察到任何不同的编译器,则不允许删除该对象。

在这种情况下,构造函数/析构函数具有副作用,因此编译器不会删除它们。

经常使用将效果委托给构造/销毁本地基于堆栈的对象的想法; 例如:

{
    Locker L(my_lock);
    ...
}

这样, ...的代码将在保持锁定的情况下执行,并且当您因任何原因离开作用域时,锁定将自动释放(只是离开块,执行return或者如果抛出异常,内)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM