优化程序与专用于 what 命令的字符串之间的交互

Interaction between the optimizer and strings dedicated to the what command

本文关键字:字符串 之间 交互 命令 what 程序 专用 用于 优化      更新时间:2023-10-16

命令"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:] 访问由易失性gl值(3.10)指定的对象,修改 对象,调用库 I/O 函数,或调用 这些操作中的任何一个都是副作用吗