"コスト"とは何かを意味し、ホストシステム(ハードウェア、オペレーティングシステム)を操作することができます。
コストメジャーがメモリ使用量の場合、コストの計算は明らかです - コピーされているもののサイズを加算します。
メジャーが実行速度(または「効率」)である場合、ゲームは異なります。ハードウェア(およびオペレーティングシステムおよびコンパイラ)は、専用回路(マシンレジスタおよびそれらの使用方法)によって特定のサイズのものをコピーする操作のパフォーマンスを最適化する傾向があります。
たとえば、あるマシンのアーキテクチャー(マシンレジスター、メモリーアーキテクチャーなど)が「スイートスポット」になるのは一般的です。あるサイズの変数をコピーするのが最も効率的ですが、より小さな変数はそれほどです。より小さな変数を複数コピーする必要があるため、変数を大きくするとコピーにかかるコストが高くなります。コンパイラは小さな値を大きな変数(またはレジスタ)にコピーし、その上で操作を実行してから、値をコピーし直す必要があるため、小さなものもコストがかかる可能性があります。浮動小数点と
例は、ソフトウェアでエミュレートされた(別名float
C++で)ネイティブ倍精度浮動小数点(C++で別名double
)をサポートするいくつかのCrayスーパーコンピュータ、および単精度のすべての操作を含みます。いくつかの古い32ビットx86 CPUも32ビット整数で内部的に動作し、16ビット整数での操作では32ビットへの変換のためにより多くのクロックサイクルが必要でした(これは現代の32ビットまたは64ビットの整数では当てはまりません) 32ビットレジスタへの/からの16ビット整数のコピー、およびその上での操作を可能にし、そのようなペナルティはより少ない)。
非常に大きな構造体を値でコピーすることは、そのアドレスを作成してコピーするよりも効率が悪くなります。しかし、上記のような要因のために、「値でそのサイズのものをコピーする」と「そのアドレスを渡すのが最善」との間のクロスオーバーポイントはあまり明確ではありません。
ポインタおよび参照は、同様の方法で実装される傾向があります(たとえば、参照渡しはポインタを渡すのと同じ方法で実装できます)が、これは保証されません。
唯一の方法は、測定することです。そして、測定値がシステムによって異なることを認識してください。
測定する必要があります。参照/コピーされているものの大きさだけが作用するわけではありません。 – juanchopanza
http://stackoverflow.com/questions/21605579/how-true-is-want-speed-pass-by-value –
要約:ネイティブタイプ(int、float、double)を渡すことは、値より大きい。ほとんどの場合、ポインタはネイティブデータ型と同じかそれ以上の大きさであるだけでなく、オプティマイザが値パラメータよりも参照パラメータを最適化することがはるかに難しいためです。 – MikeMB