0

デバッグ情報を含む高度に最適化されたコンパイル済みC++オブジェクトファイル(g ++でコンパイル、指定)があります。-O3 -g -march=amdfam10 -Wall

私はを使用してobjdump -S "objname"います。

残念ながら、ソースのインターリーブは機能していないようです。同じグループの行(1行だけでなく)が繰り返され、1つのコード行だけでなく複数の行が何度も続き、その後に1つの組立行だけが続くことがあるためです。その後、他の3/4ソースラインはあまり意味がありません。

たとえば、イテレータを含む3/4 C ++コード行が表示され、初期化の後に1/2ASM行のみが続きますか?それは意味がありますか?

何が起こっているのか考えてみませんか?

4

1 に答える 1

3

最適化されたコード (特に O3 によってオンにされた積極的な最適化を使用) は、ソースと直接対応しなくなりました。たとえば、値をメモリに格納する必要はなく、レジスタにのみ格納する必要があるため、コンパイラは変数を削除することがよくあります。また、操作が高速になるように並べ替えます。たとえば、単純な最適化は、ループ内の条件を 2 つの異なるループから選択する条件に変えて、次のようにすることです。

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

このようなものに

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

これは同等ですが、各反復での比較を回避します。

ソース コードとの直接的な対応を確認できるようにしたい場合は、O1 が可能な限り高くなっています。

于 2012-08-03T12:31:42.430 に答える