【问题标题】:Interaction between the optimizer and strings dedicated to the what command优化器和专用于 what 命令的字符串之间的交互
【发布时间】:2016-08-17 10:42:47
【问题描述】:

在我的项目中使用命令“what”来查询有关可执行文件的一些信息(编译日期,版本,...)。 我正在修复一个错误,因为我们更改了 gcc 的版本,所以输出中缺少一行。该字符串是在本地范围内定义的:

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

这个字符串从未被使用过。我假设优化器已将其删除。

我认为正常的更正应该是在全局范围内声明字符串。但是,如果不使用它,是什么阻止了未来的编译器对其进行优化呢?

我曾考虑调用strlen("@(#) Component comp1") 以确保使用该字符串,但似乎clang 正在优化此对常量字符串的调用。

我应该打电话给fopen("@(#) Component comp1") 吗?如果有人使用此名称创建文件,我可能会丢失一个文件描述符。这似乎有效,但似乎也有点矫枉过正。

【问题讨论】:

标签: c++ c


【解决方案1】:

将此声明移至全局范围很容易导致违反One Definition Rule

您可以使用volatile 关键字禁止优化这些变量。

[C++11: 3.7.3:]如果具有自动存储持续时间的变量有初始化或 带有副作用的析构函数,在结束前不得销毁 它的块,也不应该作为优化被淘汰,即使它 好像没用过,(...)

和:

[C++11: 1.9.12:] 访问由 volatile glvalue (3.10) 指定的对象,修改 一个对象,调用一个库 I/O 函数,或者调用一个函数 这些操作中的任何一个都是副作用吗

【讨论】:

  • 你建议 volatile char string_for_what[] = "@(#) Component comp1";或 volatile string string_for_what("@(#) Component comp1"); ?非常感谢
  • @BOC 我会使用 char 数组。
猜你喜欢
  • 2019-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-30
  • 1970-01-01
  • 1970-01-01
  • 2016-05-03
  • 1970-01-01
相关资源
最近更新 更多