有没有办法在编译期间或之后获取有关代码的哪些部分已经优化的信息,但是没有查看程序集或执行代码。
如果大量代码块得到优化,立刻就知道了。
答案 0 :(得分:2)
很抱歉,但您的期望与编译器的实际情况不符。无论您是要查找死代码还是查找导致应跳过的代码的错误,编译器都无法以易于阅读的形式提供信息。
使用编译器将每行源代码转换为一系列机器指令,编译器可以轻松地告诉您它没有包含与特定行相对应的任何内容。当然它无法告诉你一条线是否被翻译成机器指令但事实上这些机器指令实际上是不会被执行的 - 代码可达性是undecidable - 但我不认为这就是你所追求的反正。
问题是现代优化编译器比这复杂得多。一段代码经常被复制并在不同的假设下进行多次编译(专业化,部分评估,循环展开,......)。或者,相反,代码片段可以合并在一起(函数内联,......)。源代码和机器代码之间没有简单的对应关系。 (这就是为什么调试器有时难以报告二进制指令的确切源代码位置。)
如果大量代码被优化掉,那可能只是因为它是许多专门副本中的一个,并且特定的专业化从未发生过(例如x==0
和x!=0
的单独代码,以及单独的代码对于y==0
和y!=0
,x
和y
永远不会为0,因此x==0 && y==0
分支最终会被删除)。它可能是由编译时条件指令生成的,例如编译器优化的C宏;这种情况在C代码中经常发生,如果编译器报告了所有这样的实例,那将会产生很多误报。
获取可能未使用的代码或可能指示错误的可疑程序代码的有用报告需要与编译器完全不同的静态分析。有些工具可以做到这一点,但它们通常不是将源代码转换为优化机器代码的工具。制作静态分析工具既可以检测潜在的问题,又可以发挥作用,并且不会产生很多误报,而这些误报实际上是不可用的。
答案 1 :(得分:1)
gcc -S
将输出已传递给汇编程序的汇编代码(并最终链接到可执行文件中)。如果您以正确的方式眯眼(并且耐心等待),您可以从那里向后工作以确认给定的代码是否实际包含在可执行文件中,或者是否已经过优化。
显然不是你要做的事情,除非你怀疑事情正在发生,考虑到所需的时间和精力......