10

コンパイラが生成するデフォルトのコンストラクタとデストラクタがインラインであるかどうかに興味があります。どちらの方法でも正当化できるからです。一方では、デフォルトのコンストラクタ/デストラクタをインラインにしないで、後で追加してもABIが破損しないようにします(デフォルトのみが存在するときにコンパイルされたオブジェクトファイルは、定義したものではなく、生成された定義をインライン化するため)。一方、C ++コンパイラがCコンパイラでコンパイルした場合と同様に実行するCコードをコンパイルする場合、割り当てられたすべての構造に対してコンストラクタ/デストラクタ呼び出しを追加することはできません。C++では、クラス間の機能の違いはstructはデフォルトのアクセス保護であると想定されています。たぶんリンカーはこれにどういうわけか対処しますか?たぶん答えはコンパイラによって異なりますか?

この質問の結果:C ++でPOD構造体を使用している場合、デフォルトの代わりに空のインラインコンストラクタ/デストラクタを自分で定義することで、理論的には一部のコンパイラでメリットがありますか?

4

3 に答える 3

19

C ++標準では、12.1 [class.ctor]/5で

暗黙的に宣言されたデフォルトコンストラクタは、そのクラスのインラインパブリックメンバーです。

そして12.4[class.dtor]/3で

暗黙的に宣言されたデストラクタは、そのクラスのインラインパブリックメンバーです。

于 2011-06-08T03:51:27.633 に答える
3

C ++でPOD構造体を使用している場合、デフォルトの代わりに空のインラインコンストラクタ/デストラクタを自分で定義することで、理論的には一部のコンパイラでメリットがありますか?

理論的には、はい!任意の関数(コンストラクタとデストラクタを含む)をインラインで宣言できます。関数本体をクラス定義に入れることは、そのための1つの方法です。ただし、実際に関数をインライン化するかどうかはコンパイラー次第です。

于 2011-06-08T03:46:47.907 に答える
2

コンパイラによって異なりますが、一般的にはそうです。そうすべきです。

少なくともgccを使用すると、インライン関数とオフライン関数の両方が生成されます。アウトオブラインバージョンは「linkonce」としてマークされているため、デフォルトコンストラクターを生成するオブジェクトの数に関係なく、リンクされた出力には最大で1つのバージョンのみが含まれます。実際、誰もデフォルトのコンストラクターをアウトオブラインで使用していない場合、それはリンクされた出力にまったく含まれず、事実上純粋なインライン関数があります。

于 2011-06-08T03:56:23.150 に答える