簡體   English   中英

優化器和專用於 what 命令的字符串之間的交互

[英]Interaction between the optimizer and strings dedicated to the what command

我的項目中使用命令“what”來查詢有關可執行文件的一些信息(編譯日期、版本等)。 我正在修復一個錯誤,因為我們更改了 gcc 的版本,因此輸出中缺少一行。 該字符串是在本地范圍內定義的:

char string_for_what = "@(#) Component comp1";

從未使用過此字符串。 我假設優化器已將其刪除。

我認為正常的更正應該是在全局范圍內聲明字符串。 但是,如果不使用它,什么會禁止未來的編譯器對其進行優化?

我曾考慮調用strlen("@(#) Component comp1")以確保使用該字符串,但似乎 clang 正在優化對常量字符串的調用。

我應該調用fopen("@(#) Component comp1")嗎? 如果有人用這個名字創建了一個文件,我可能會丟失一個文件描述符。 這似乎有效,但似乎也有點矯枉過正。

將此聲明移動到全局范圍可能很容易導致違反單一定義規則

您可以使用volatile關鍵字禁止優化這些變量。

[C++11: 3.7.3:]如果具有自動存儲期的變量有初始化或有副作用的析構函數,則在其塊結束前不應銷毀,也不應作為優化消除,即使它是似乎未使用,(...)

和:

[C++11: 1.9.12:]訪問由 volatile 泛左值 (3.10) 指定的對象、修改對象、調用庫 I/O 函數或調用執行任何這些操作的函數都是副作用

暫無
暫無

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

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