「コスト」の意味と、操作に関するホスト システム (ハードウェア、オペレーティング システム) のプロパティによって異なります。
コストの尺度がメモリ使用量である場合、コストの計算は明らかです。コピーされているもののサイズを合計します。
測定が実行速度 (または「効率」) である場合、ゲームは異なります。ハードウェア (およびオペレーティング システムとコンパイラ) は、専用回路 (マシン レジスタとその使用方法) のおかげで、特定のサイズのものをコピーする操作のパフォーマンスに対して最適化される傾向があります。
たとえば、マシンが「スイート スポット」をもたらすアーキテクチャ (マシン レジスタ、メモリ アーキテクチャなど) を持っていることはよくあることです。あるサイズの変数をコピーするのが最も「効率的」ですが、より大きなまたは小さい変数をコピーするのは効率的です。そうではありません。小さなチャンクの複数のコピーを行う必要がある場合があるため、大きな変数はコピーに多くのコストがかかります。コンパイラは小さい値を大きい変数 (またはレジスタ) にコピーし、それに対して操作を実行してから、値をコピーして戻す必要があるため、小さいものはより多くのコストがかかる場合があります。
浮動小数点の例には、倍精度浮動小数点 (別名double
C++) をネイティブにサポートするいくつかの Cray スーパーコンピューターが含まれ、単精度 (別名 C++) のすべての操作float
はソフトウェアでエミュレートされます。一部の古い 32 ビット x86 CPU も内部で 32 ビット整数を使用して動作し、16 ビット整数での操作には、32 ビットとの間の変換のために、より多くのクロック サイクルが必要でした (これは、最新の 32 ビットまたは 64 ビットでは当てはまりません)。ビット x86 プロセッサ (16 ビット整数を 32 ビット レジスタとの間でコピーしたり、32 ビット レジスタからコピーしたり、そのようなペナルティが少なくて済むため)。
非常に大きな構造体を値でコピーすることは、そのアドレスを作成してコピーするよりも効率が悪いことは、少し簡単です。ただし、上記のような要因により、「そのサイズのものを値でコピーするのが最善」と「そのアドレスを渡すのが最善」の交差点はあまり明確ではありません。
ポインターと参照は同様の方法で実装される傾向があります (たとえば、参照渡しはポインターを渡すのと同じ方法で実装できます) が、それは保証されません。
確認する唯一の方法は、それを測定することです。また、測定値はシステムによって異なることに注意してください。