簡體   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