【发布时间】:2012-07-10 13:12:00
【问题描述】:
我正在用 C++/Qt 编写一个包含图形文件解析器的程序。我使用g++ 编译项目。
在开发过程中,我不断比较不同编译器标志与优化和调试信息以及 Qt 的调试标志(打开/关闭 qDebug() 和 Q_ASSERT())之间的低级解析器层的性能。
现在我面临一个问题,唯一正常运行的构建是没有任何优化的构建。所有其他版本,即使是-O1,似乎都以另一种方式工作。它们由于不满足的断言而崩溃,在没有-O... 标志的情况下编译时满足。该代码不会产生任何编译器警告,即使使用 -Wall。
我非常确定我的程序中存在错误,这似乎只有在启用优化后才会有害。问题是:即使在调试程序时也找不到它。解析器似乎从文件中读取了错误的数据。当我运行一些简单的测试用例时,它们运行良好。当我运行一个更大的测试用例(直接从文件读取的图表上的路线计算)时,文件中存在我无法解释的错误读取。
我应该从哪里开始追踪这种未定义行为的问题? 这种不同的行为可能涉及哪些优化方法?(我可以一个接一个地启用所有标志,但我不知道那么多编译器标志,但-O... 我知道有一个很多,所以这需要很长时间。)一旦我知道错误的类型,我相信我迟早会找到它。
如果您能告诉我哪些编译器优化方法可能适合此类问题,您可以帮我很多。
【问题讨论】:
-
在某处听起来像是未定义的行为。
-
@R.MartinhoFernandes 是的,但我怎样才能找到它?也许使用 valgrind?
-
是的,valgrind 会警告你未初始化的值。
-
请注意,
-Wall实际上并不是所有警告,而是很多警告。你需要-Wextra来添加更多,但它仍然不会是所有可用的警告。
标签: c++ qt g++ compiler-optimization