現在のシステムに応じて 32 ビットまたは 64 ビットになる可能性があるためsize_t
、常に size_t を参照または const 参照として関数に渡し、常に 4 バイトになるようにするのが最善でしょうか? (8 バイトの場合は、コピーを作成する必要があります) 私が調べた多くのオープン ソース コードはこれを行いませんが、コンパイラが 64 ビット整数をサポートしている場合、それらの 64 ビット整数は常に参照として渡されます。size_t に対してこれを行わないのはなぜですか? あなたの意見はどうなのか気になります。
5 に答える
通常、すべてのプリミティブ型を値で渡すのは、それらをコピーするために必要な操作が 1 つのアセンブリ命令だけであるためです。size_t
したがって、s を参照渡しよりも値渡しの方が適していsize_t
ます。
ほとんどの実装size_t
では、オブジェクトへのポインターとオブジェクトへの参照はまったく同じサイズです。
このように考えてください:size_t
任意のオブジェクトのサイズを保持できchar*
、任意のオブジェクト内の任意のバイトをアドレス指定するために使用できるため、密接に関連するサイズが必要であることsize_t
を意味します。char*
したがって、あなたの考えはほとんどの実装では意味がありません。
私はあなたの論理にはあまり従いませんでした。参照渡しの場合、現在のシステムに応じて、アドレスは 32 ビットまたは 64 ビットになります。
いずれにせよ、参照で渡す利点はないと思います。
参照渡しの問題は、コンパイラが値をメモリに格納し、その格納された値のアドレスを参照として渡す必要があることです。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
size_t
メモリに割り当てることができるオブジェクトのサイズをバイト単位で保持できることが保証されています。これは通常、ポインタと同じサイズであることを意味する傾向があり、ポインタは通常、CPU レジスタのサイズです。
参照渡しは役に立ちません。ポインターはほぼ確実に、少なくともsize_t と同じ大きさです (そうでない場合は、size_t を問題なく小さくすることができます)。いずれにしても、ほとんどの 64 ビット ABI は 64 ビット レジスタで整数引数を渡すため、スタック フットプリントに違いはありません。