2

コンストラクターを定義せずに C++ プログラムを作成しました。コードは次のとおりです。

#include<iostream>
using namespace std;
class test
{
    public:

        void print()
        {
            cout<< "Inside Print"<<endl;
        }
};
int main()
{
   test t;
   t.print();
   return 0;
}

コードを逆アセンブルしたところ、デフォルト コンストラクターの呼び出しは見つかりませんでした。以下は、メイン関数のアセンブリ コード スニペットです。

8 main:
      9 .LFB1516:
     10         pushl   %ebp
     11 .LCFI0:
     12         movl    %esp, %ebp
     13 .LCFI1:
     14         subl    $8, %esp
     15 .LCFI2:
     16         andl    $-16, %esp
     17         movl    $0, %eax
     18         subl    %eax, %esp
     19         leal    -1(%ebp), %eax
     20         movl    %eax, (%esp)
     21         call    _ZN4test5printEv
     22         movl    $0, %eax
     23         leave
     24         ret

ご覧callのとおり、上記のスニペットには命令が 1 つしかありません (行番号 21)。関数を呼び出していprint()ます。ここで、コードを少し変更して、constructor. コードは次のとおりです。

#include<iostream>
using namespace std;
class test
{
    public:
        test()
        {
        }
        void print()
        {
            cout<< "Inside Print"<<endl;
        }
};
int main()
{
    test t;
    t.print();
    return 0;
}

コードを再度逆アセンブルしたところ、次のことがわかりました。

 8 main:
      9 .LFB1519:
     10         pushl   %ebp
     11 .LCFI0:
     12         movl    %esp, %ebp
     13 .LCFI1:
     14         subl    $8, %esp
     15 .LCFI2:
     16         andl    $-16, %esp
     17         movl    $0, %eax
     18         subl    %eax, %esp
     19         leal    -1(%ebp), %eax
     20         movl    %eax, (%esp)
     21         call    _ZN4testC1Ev
     22         leal    -1(%ebp), %eax
     23         movl    %eax, (%esp)
     24         call    _ZN4test5printEv
     25         movl    $0, %eax
     26         leave
     27         ret

ご覧のとおり、21 行目でコンストラクターを呼び出しています。私の質問は、コードでコンストラクターを定義しない場合、コンパイラーはすべての場合にデフォルトのコンストラクターを提供しないのですか? そうでない場合、どのような状況で、またはコンパイラーにデフォルトのコンストラクターを強制的に提供させるにはどうすればよいですか???

長い質問で申し訳ありません:P

4

3 に答える 3

6

コンパイラに強制的にバイナリを肥大させ、プログラムの速度を低下させる必要があるのはなぜですか?

優れたコンパイラは、それが意味をなす場合にのみ、デフォルトのコンストラクター(またはその他の関数)を呼び出します-それを呼び出すと何らかの効果が生じる場合。

最適化は、プログラムからデフォルトのコンストラクター (何もしない) 呼び出しを除外するだけです。

于 2013-09-16T16:42:24.163 に答える