什么是最简单的“未使用”代码,不会被优化?

时间:2012-07-27 23:54:14

标签: c++ debugging optimization

我经常想通过断点测试函数中变量的值。在许多情况下,该变量实际上从未被任何“做东西”的代码引用,但这并不意味着我仍然不想看到它。不幸的是,优化器正在反对我,只是在编译时删除所有这些代码,所以我不得不提出令人费解的粗俗来欺骗编译器认为这些值实际上很重要,所以它们不会被优化掉。我不想关闭优化器,因为它在其他地方做了很重要的事情,但是对于这一段代码,我想暂时禁用它以进行调试。

6 个答案:

答案 0 :(得分:4)

生成可观察行为的代码符合定义的要求。例如,printf("")

对volatile变量的访问也正式构成了可观察的行为,尽管如果一些编译器仍然丢弃了“不必要的”volatile变量,我也不会感到惊讶。

出于这个原因,对I / O功能的调用对我来说似乎是最好的。

答案 1 :(得分:1)

您可以尝试使用“volatile”关键字。一些介绍在http://en.wikipedia.org/wiki/Volatile_variable

一般来说,volatile关键字旨在防止编译器对代码应用任何优化,这些代码假定变量值不能“自行”更改。

答案 2 :(得分:0)

你试过吗

#pragma optimize("",off)

我认为MSVS具体 - http://msdn.microsoft.com/en-us/library/chh3fb0k(v=vs.80).aspx

答案 3 :(得分:0)

你没有指定你的编译器所以我只是在这里添加我在我专门用于调试的任何变量上使用volatile说明符。在我的编译器(Embarcadero RAD Studio C ++ Builder)中,我已经使用了几年,并没有将变量优化出来。也许你不使用这个编译器,但如果你这样做,我可以说volatile一定对我有用。

答案 4 :(得分:0)

以下是我使用过的一个技巧示例:

#include <ctime>
#include <iostream>
int main() {
    std::cout << "before\n";
    if (std::time(NULL) == 0) {
        std::cout << "This should not appear\n";
    }
    std::cout << "after\n";
}

time()调用应始终返回正值,但编译器无法知道。

答案 5 :(得分:0)

如果在使用调试器的断点中查看变量的唯一目的,则可以将变量设置为global。例如,您可以维护一个全局缓冲区:

#ifdef DEBUG
char dbg_buffer[512];
template <typename T>
void poke_dbg (const T &t) {
    memcpy(dbg_buffer, &t, sizeof(T));
}
#else
#define poke_dbg(x)
#endif

然后在调试期间,您可以检查dbg_buffer的内容(如果需要,可以使用适当的强制转换)。