2017-09-24 10 views
0

次のコードのx86-64asm generated by GCC 7.1を見ると、aのコンストラクタでコードが生成され、bにはコンストラクタのラベルがありません。なぜデフォルトの空のコンストラクタがC++で異なるマシンコードを生成するのですか?

class a { 
public: 
    int aint; 

    a() { } 
}; 

class b { 
public: 
    int bint; 

    b() = default; 
}; 

int main() { 
    a ac; 
    //   lea  rax, [rbp-4] 
    //   mov  rdi, rax 
    //   call a::a() 
    ac.aint = 2; 
    //   mov  DWORD PTR [rbp-4], 2 


    b bc;    // no instructions for this statement 
    bc.bint = 5; 
    //   mov  DWORD PTR [rbp-8], 5 

    return 0; 
} 

ここでコンストラクタで生成されるコードはどうして違うのですか?なぜa() { }b() = defaultと同じコードを生成しないのですか?

+0

? – EJP

+0

@EJP、彼はリンクでgodboltのコードを示しました。 – prl

+2

最適化の有無にかかわらずコンパイルしていますか?これが理由でない場合(例えば、 '-O0')。 – Peter

答えて

5

最適化(-O0)を行わないと、gccは簡単にデバッグできるコードを生成するので、すべてのステートメントと関数呼び出しがソースに含まれます。 :: aにブレークポイントを設定することができます。より高い最適化レベルでは、そのコンストラクター呼び出しが表示されません。

関連する問題