3

現在のシステムに応じて 32 ビットまたは 64 ビットになる可能性があるためsize_t、常に size_t を参照または const 参照として関数に渡し、常に 4 バイトになるようにするのが最善でしょうか? (8 バイトの場合は、コピーを作成する必要があります) 私が調べた多くのオープン ソース コードはこれを行いませんが、コンパイラが 64 ビット整数をサポートしている場合、それらの 64 ビット整数は常に参照として渡されます。size_t に対してこれを行わないのはなぜですか? あなたの意見はどうなのか気になります。

4

5 に答える 5

15

通常、すべてのプリミティブ型を値で渡すのは、それらをコピーするために必要な操作が 1 つのアセンブリ命令だけであるためです。size_tしたがって、s を参照渡しよりも値渡しの方が適していsize_tます。

于 2011-02-04T07:09:16.773 に答える
6

ほとんどの実装size_tでは、オブジェクトへのポインターとオブジェクトへの参照はまったく同じサイズです。

このように考えてください:size_t任意のオブジェクトのサイズを保持できchar*、任意のオブジェクト内の任意のバイトをアドレス指定するために使用できるため、密接に関連するサイズが必要であることsize_tを意味します。char*したがって、あなたの考えはほとんどの実装では意味がありません。

于 2011-02-04T07:17:20.223 に答える
3

私はあなたの論理にはあまり従いませんでした。参照渡しの場合、現在のシステムに応じて、アドレスは 32 ビットまたは 64 ビットになります。

いずれにせよ、参照で渡す利点はないと思います。

于 2011-02-04T07:12:24.417 に答える
3

参照渡しの問題は、コンパイラが値をメモリに格納し、その格納された値のアドレスを参照として渡す必要があることです。64 ビット アーキテクチャでは、呼び出し規則により、メモリに値を格納することなく、より多くの情報をレジスタ (6 つのレジスタ) に渡すことができるため、参照によって小さな値を渡すことで最適化を禁止します。

この質問には他にもあります。次から始めてください。

http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/

http://en.wikipedia.org/wiki/X86_calling_conventions#x86-64_Calling_Conventions

于 2011-02-04T13:05:29.383 に答える
3

size_tメモリに割り当てることができるオブジェクトのサイズをバイト単位で保持できることが保証されています。これは通常、ポインタと同じサイズであることを意味する傾向があり、ポインタは通常、CPU レジスタのサイズです。

参照渡しは役に立ちません。ポインターはほぼ確実に、少なくともsize_t と同じ大きさです (そうでない場合は、size_t を問題なく小さくすることができます)。いずれにしても、ほとんどの 64 ビット ABI は 64 ビット レジスタで整数引数を渡すため、スタック フットプリントに違いはありません。

于 2011-02-04T07:17:12.097 に答える