0

我有一个带有调试信息的高度优化的编译C++目标文件(用 g++ 编译,指定)。-O3 -g -march=amdfam10 -Wall

我正在使用objdump -S "objname".

不幸的是,交错源代码似乎不起作用,因为有时我看到同一组行(不仅仅是单行)重复,而且不仅仅是一个代码行,而是多个代码行,很多次,然后只有一条装配线,然后是其他 3/4 源代码行,没有多大意义。

例如,我看到 3/4 C++ 代码行带有迭代器,并且映射初始化后跟只有 1/2 ASM 行?是否有意义?

知道会发生什么吗?

4

1 回答 1

3

优化后的代码(尤其是 O3 开启的积极优化)不再与源代码直接对应。例如,编译器通常会消除变量,因为值不需要存储在内存中,只需要存储在寄存器中。它还将重新排序操作,以便它们更快。例如,一个简单的优化是将循环内的条件变成在两个不同循环之间进行选择的条件,变成这样

while(1){
    if(foo){
        bar();
    } else {
        baz();
    }
}

变成这样的东西

if(foo){
    while(1){
        bar();
    }
} else {
    while(1){
        baz();
    }
}

这是等效的,但避免在每次迭代时进行比较。

如果你想能看到和源代码直接对应,O1差不多就是你能去的高了。

于 2012-08-03T12:31:42.430 回答