防止英特尔编译器过度优化未使用的变量?

3

有没有一种方法可以告诉Intel编译器不要优化未使用的变量?我正在尝试计时某些代码,并且目前通过在变量上使用cout语句来防止优化。

理想情况下,解决方案将通过pragma/hint告诉编译器不要删除变量,否则我将不得不使用程序参数?


1
当我在进行微基准测试时,我发现volatile的效果已经足够好了。 - Cody Gray
一个带有未使用变量的基准测试有什么价值?即使它们没有被优化掉,它们只是堆栈上的一些浪费空间(这是免费的,只需要将ESP稍微移动一下)。一旦你真正开始使用这些变量,编译器可能会改变寄存器分配和类似的东西,从而改变程序的行为。 - Matteo Italia
@CodyGray谁说我在进行微基准测试了?这是非常惊人的评论,考虑到我还没有向您展示代码的大小... - user997112
2
首先,所谓的微基准测试是指在“上下文之外”对代码进行基准测试。这只有在优化未使用的变量时才会起作用。如果您正在对整个应用程序进行分析,您需要让优化器充分参与。其次,我说的是当那样做时。我并不是想暗示您在做什么。 - Cody Gray
如果变量未被使用,则没有代码使用它们。你在计时什么?是试图为调试器保留一个值吗? - jthill
1个回答

3

在将变量赋值时使用volatile关键字,以便告诉编译器不要对其进行优化。据我所知,这是C/C++的标准,因此它应该适用于任何编译器。请参阅MSDN链接获取更多信息。


这里有一个链接,涵盖了这个主题的不同线程:link。根据C++标准($7.1.5.1/8),volatile是一种提示实现避免涉及对象的激进优化,因为对象的值可能会被实现无法检测到的手段改变。 - Elias
@MatteoItalia:请查看1.9程序执行§8:“符合规范的实现的最低要求是:
  • 对于易失性对象的访问严格按照抽象机器的规则进行评估。[...]”
- Deduplicator
@MatteoItalia:这是“as-if”规则限制的一部分。我的引用继续说道:“它们共同被称为程序的可观察行为。[注意:每个实现可能定义抽象和实际语义之间更严格的对应关系。—注]” - Deduplicator
1
标准中的这些部分基本上是没有意义的,因为它们是平台无关的,并且没有平台无关的“访问”概念或“观察”访问的含义。我还没有听到任何人能够清晰地解释“抽象机器规则”是什么。 - David Schwartz
使用volatile关键字标记变量具有一个缺点,即会对基准测试结果产生影响。编译器在处理被标记为volatile的变量时会应用较少激进的优化策略。通常我会总结那些不应被优化而丢弃的变量,并将它们打印出来或作为返回参数使用。 - Alexander Weggerle
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接