Oracle® Developer Studio 12.5: C++ ユーザーズガイド

印刷ビューの終了

更新: 2016 年 7 月
 
 

9.4 値クラスの使用

構造体や共用体などの C++ クラスは、値によって渡され、値によって返されます。POD (Plain-Old-Data) クラスの場合、C++ コンパイラは struct を C コンパイラと同様に渡す必要があります。これらのクラスのオブジェクトは、直接的に渡されます。ユーザー定義のコピーコンストラクタを持つクラスのオブジェクトの場合、コンパイラは実際に、そのオブジェクトのコピーを構築し、コピーにポインタを渡し、返されたあとでコピーを破壊することが必要です。これらのクラスのオブジェクトは、間接的に渡されます。この 2 つの条件の中間に位置するクラスの場合は、コンパイラによってどちらの扱いにするかが選択されます。しかし、そうすることでバイナリ互換性に影響が発生するため、コンパイラは各クラスに矛盾が出ないように選択する必要があります。

ほとんどのコンパイラでは、オブジェクトを直接渡すと実行速度が上がります。特に、複素数や確率値のような小さな値クラスの場合に、実行速度が大幅に上がります。そのためプログラムの効率は、間接的ではなく直接渡される可能性が高いクラスを設計することによって向上する場合があります。

クラスに次の要素が含まれる場合、クラスは間接的に渡されます。

  • ユーザー定義のコピーコンストラクタ

  • ユーザー定義のデストラクタ

  • 間接的に渡される基底クラス

  • 間接的に渡される非静的データメンバー

これらの要素が含まれない場合は、クラスは直接渡されます。

9.4.1 クラスを直接渡す

クラスが直接渡される可能性を最大にするには、次のようにしてください。

  • 可能なかぎりデフォルトのコンストラクタ (特にデフォルトのコピーコンストラクタ) を使用する。

  • 可能なかぎりデフォルトのデストラクタを使用する。デフォルトデストラクタは仮想ではないため、デフォルトデストラクタを使用したクラスは、通常は基底クラスにするべきではありません。

  • 仮想関数と仮想基底クラスを使用しない。

9.4.2 各種のプロセッサでクラスを直接渡す

C++ コンパイラによって直接渡されるクラスおよび共用体は、C コンパイラが構造体または共用体を渡す場合とまったく同じように渡されます。しかし、C++ の構造体と共用体の渡し方は、アーキテクチャーによって異なります。

表 22  アーキテクチャー別の構造体と共用体の渡し方
アーキテクチャー
説明
SPARC V7 および V8
構造体と共用体は、呼び出し元で記憶領域を割り当て、その記憶領域へのポインタを渡すことによって渡されます。つまり、構造体と共用体はすべて参照により渡されます。
SPARC V9
16 バイト (32 バイト) 以下の構造体は、レジスタ中で渡され (返され) ます。共用体およびそのほかのすべての構造体は、呼び出し元で記憶領域を割り当て、その記憶領域へのポインタを渡すことによって渡されます。つまり、小さな構造体はレジスタで渡され、共用体と大きな構造体は参照により渡されます。この結果、小さな値のクラスは基本の型と同じ効率で渡されることになります。
x86 プラットフォーム
構造体と共用体を渡すには、スタックで領域を割り当て、引数をそのスタックにコピーします。構造体と共用体を返すには、呼び出し元のフレームに一時オブジェクトを割り当て、一時オブジェクトのアドレスを暗黙の最初のパラメータとして渡します。