簡體   English   中英

為什么不能-O0禁用gcc編譯優化?

[英]Why can't -O0 disable gcc compile optimization?

string str="fujian";

有些書說代碼會觸發復制構造函數,但是g ++會對它進行優化,以便不會調用復制構造函數。

但是,我使用g ++命令-O0來禁用優化,但它仍然無法觸發復制構造函數。

怎么理解呢?

使用GCC和Clang,您可以使用-fno-elide-constructors elide -fno-elide-constructors編譯標志來關閉復制/移動省略優化。

復制省略規則基於ISO C ++ 12.8。 雖然通常用於優化的其他規則在第1節中統稱為“as-if”規則(這允許實現生成程序與基於抽象機器模型的“非優化”程序語義略有不同),但這個規則是如此特殊的,您可以對待“優化”代碼本身的行為與原始含義一樣精確。 換句話說,抽象機構的行為中可能根本不存在省略的構造函數調用。

如果沒有未定義的行為,根據as-if規則進行或不進行優化,優化程序和非優化程序的可觀察行為應該相同(盡管它們可能在性能上有所不同等)。 但是,復制省略更具侵略性,即它可以改變可觀察的行為。

你最好不要依賴復制省略產生的差異。 因此,對於普通優化選項保持相同的行為是合理的,並提供單獨的選項來控制那些知道風險並確實需要它的用戶的精確(不同)行為。

WG21 / N4296

1.9程序執行

5執行格式良好的程序的符合實現應該產生與具有相同程序和相同輸入的抽象機的相應實例的可能執行之一相同的可觀察行為。 但是,如果任何此類執行包含未定義的操作,則此國際標准不要求使用該輸入執行該程序的實現(甚至不考慮第一個未定義操作之前的操作)。

8對符合要求的實施的最低要求是:

(8.1) - 嚴格按照抽象機的規則評估對易失性對象的訪問。

(8.2) - 在程序終止時,寫入文件的所有數據應與根據抽象語義產生的程序執行的可能結果之一相同。

(8.3) - 交互設備的輸入和輸出動態應以在程序等待輸入之前提示輸出實際傳送的方式進行。 構成交互設備的是實現定義的。

這些統稱為程序的可觀察行為 [注意:每個實現可以定義抽象和實際語義之間更嚴格的對應關系。 - 尾注]

12.8復制和移動類對象

31當滿足某些條件時,允許實現省略類對象的復制/移動構造,即使為復制/移動操作選擇的構造函數和/或對象的析構函數具有副作用。 在這種情況下,實現將省略的復制/移動操作的源和目標視為僅僅兩種不同的引用同一對象的方式,並且該對象的銷毀發生在兩個對象的后期時間。在沒有優化的情況下銷毀.122在下列情況下允許復制/移動操作(稱為復制省略)的這種省略(可以合並以消除多個副本):

...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM