43

『 Effective C++』という本の中で、以下の一節を見ました。

その結果、あなたが書くならば

class Empty{};

これは、次のように記述した場合と本質的に同じです。

class Empty {
public:
    Empty() { ... }
    Empty(const Empty& rhs) { ... }
    ~Empty() { ... }
    Empty& operator=(const Empty& rhs) { ... } // copy assignment operator
};

次のコードにより、各関数が生成されます。

Empty e1;
Empty e2(e1);
e2 = e1;

しかし、上記のコードをコンパイルして作成された実行可能ファイルを逆アセンブルした後、そうではないことに気付きました。呼び出されている関数はありません。

主なアセンブリ コードは次のとおりです。

00000000004006cd <main>:
  4006cd:       55                      push   %rbp
  4006ce:       48 89 e5                mov    %rsp,%rbp
  4006d1:       b8 00 00 00 00          mov    $0x0,%eax
  4006d6:       5d                      pop    %rbp
  4006d7:       c3                      retq 

.textセグメントに「空」という名前の関数はありません。

では、コンストラクターまたは空のクラスの割り当てを呼び出した後のコンパイラーの動作は実際にはどうなるのでしょうか? 本が言ったように、それはいくつかの機能を生成しますか? もしそうなら、それらはどこに保管されていますか?

4

3 に答える 3