構造体や共用体などの C++ クラスは、値によって渡され、値によって返されます。POD (Plain-Old-Data) クラスの場合、C++ コンパイラは struct を C コンパイラと同様に渡す必要があります。これらのクラスのオブジェクトは、直接的に渡されます。ユーザー定義のコピーコンストラクタを持つクラスのオブジェクトの場合、コンパイラは実際に、そのオブジェクトのコピーを構築し、コピーにポインタを渡し、返されたあとでコピーを破壊することが必要です。これらのクラスのオブジェクトは、間接的に渡されます。この 2 つの条件の中間に位置するクラスの場合は、コンパイラによってどちらの扱いにするかが選択されます。しかし、そうすることでバイナリ互換性に影響が発生するため、コンパイラは各クラスに矛盾が出ないように選択する必要があります。
ほとんどのコンパイラでは、オブジェクトを直接渡すと実行速度が上がります。特に、複素数や確率値のような小さな値クラスの場合に、実行速度が大幅に上がります。そのためプログラムの効率は、間接的ではなく直接渡される可能性が高いクラスを設計することによって向上する場合があります。
クラスに次の要素が含まれる場合、クラスは間接的に渡されます。
ユーザー定義のコピーコンストラクタ
ユーザー定義のデストラクタ
間接的に渡される基底クラス
間接的に渡される非静的データメンバー
これらの要素が含まれない場合は、クラスは直接渡されます。