size_t
は現在のシステムによっては32ビットまたは64ビットになる可能性があるので、常にsize_tを参照またはconst参照として関数に渡すのがベストです4バイト? (8バイトの場合はコピーを作る必要があります)私が見たオープンソースのコードはたくさんありますが、コンパイラが64ビットの整数をサポートしている場合、これらの64ビットの整数は常に参照として渡されます。なぜ彼らはsize_tに対してこれをしないのですか?あなたの意見は何ですか?引数としてsize_tを渡す「効率」
答えて
すべてのプリミティブ型をコピーするのに必要な操作は、通常は単なるアセンブリ命令であるため、すべてのプリミティブ型を値渡しすることが慣例です。したがって、値でsize_t
を渡すことは、参考としてsize_t
を渡すよりも好ましい。
私はあなたのロジックにかなり従っていません。参照渡しの場合、現在のシステムによっては、アドレスは32ビットまたは64ビットのいずれかになります。
いずれにしても、私は参考としてそれを渡す利点がありません。
size_t
は、メモリに割り当てることができるオブジェクトのサイズをバイト単位で保持できることが保証されています。これは通常、ポインタと同じサイズであることを意味する傾向があります。これは、通常はCPUレジスタのサイズです。
参照渡しは役に立ちません。ポインタはほぼ確かに少なくとものsize_tに相当します(そうでない場合、問題なくsize_tを小さくすることができます)。そして、いずれの場合でも、ほとんどの64ビットABIは64ビットレジスタに整数引数を渡すため、スタックフットプリントに違いはありません。
size_t
のほとんどの実装では、オブジェクトへのポインタとオブジェクトへの参照はまったく同じサイズです。この方法それの
思う:size_t
は任意のオブジェクトのサイズを保持することができますし、任意のオブジェクト内の任意のバイトに対処するためにchar*
を使用することができますので、それはsize_t
とchar*
が密接に関連大きさを持たなければならないことを意味します。したがって、あなたのアイデアはほとんどの実装で意味をなさない。
'sizeof(char *)'は 'sizeof(size_t) 'より大きくてもよいことに注意してください。単一のオブジェクトがセグメントのサイズよりも大きくなることはできないが、ポインタは複数のセグメントを指すことができるはずのセグメント化されたメモリシステムでは、 – musiphil
参照渡しの問題は、コンパイラが値をメモリに格納し、その格納された値のアドレスを参照として渡す必要があることです。 64ビットアーキテクチャでは、メモリに値を格納することなく、レジスタ(6つのレジスタ)にもっと多くの情報を渡すことができるため、小さな値を参照渡しすることで最適化を禁止します。あなたはconstの参照が64ビットシステム上の4つのバイトがあると信じていますなぜ
http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/
http://en.wikipedia.org/wiki/X86_calling_conventions#x86-64_Calling_Conventions
- 1. 引数としての関数の効率的な使用
- 2. これは、文字列を関数の引数として渡すメモリ効率のよい方法です。
- 3. データフレームを渡して引数として関数pandasを渡す
- 4. 引数を引数として渡します
- 5. 引数をクラスとして渡す
- 6. Python:パスを引数として渡す
- 7. "this"を引数として渡す - C#
- 8. Thriftサービスを引数として渡す
- 9. メソッドを引数として渡す
- 10. 引数としてnet.socketを渡す
- 11. 引数としてstd :: leftを渡す
- 12. gets.chompを引数として渡す
- 13. クラスインスタンスを引数として渡す
- 14. ブロックを引数として渡す
- 15. python numpyとメモリ効率(参照渡しと値渡し)
- 16. オブジェクト引数の効率的なメモ帳
- 17. パラメータとして渡される定数を使用したJavascriptの効率
- 18. システム変数をエスケープして引き数として渡す
- 19. Clojure関数をJavaに効率的に渡します。
- 20. テンプレート引数へのポインタを関数の引数として渡しますか?
- 21. Python - 引数を他の関数の引数として渡す関数
- 22. 引数として二重引用符を渡したい
- 23. イベントと変数を引数として渡す方法
- 24. C++で関数を引数として渡すときのエラー
- 25. 引数を渡すこと
- 26. 引数を引数として持つ関数を渡す方法
- 27. 引数を渡してvoid *を返す関数を渡す
- 28. 関数内の引数としてサブ関数名を渡す
- 29. C++/Arduino引数として関数を渡します。
- 30. 引数を関数の属性として渡しますか?
:
この質問へのより多くがあり、あなたがで開始したいのでしょうか?そして、4バイトの参照と64ビットのsize_tを持つのはどのような意味ですか? –
ああ、私はそれを忘れていたとは思っていません。今質問を削除したい – Marlon
'size_t'は64ビット、ポインタは32ビットになるシステムは? – Mikel