我有一个高度优化的编译 C ++ 目标文件(使用g ++编译,指定-O3 -g -march=amdfam10 -Wall
)并带有调试信息。
我正在使用objdump -S "objname"
。
不幸的是交错源似乎不起作用,因为有时候我会看到同一组线(不只是一行)重复,而不是只有一个代码行而是多个代码行,很多次,然后是只有一条装配线,然后是其他3/4源线,没有多大意义。
例如,我看到带有迭代器的3/4 C ++代码行,并映射初始化后只有1/2 ASM行?它有意义吗?
知道可能会发生什么吗?
答案 0 :(得分:3)
优化的代码(尤其是O3启用的积极优化)不再与源直接对应。例如,编译器通常会消除变量,因为这些值不需要存储在内存中,只能存储在寄存器中。它还将重新排序操作,以便它们更快。例如,一个简单的优化是将循环中的条件转换为在两个不同循环之间选择的条件,转换为类似的东西
while(1){
if(foo){
bar();
} else {
baz();
}
}
这样的事情
if(foo){
while(1){
bar();
}
} else {
while(1){
baz();
}
}
这是等价的,但避免在每次迭代时进行比较。
如果您希望能够看到与源代码的直接对应关系,那么O1就可以达到最高水平。