QStringコンストラクタとその他の関数QCharはconst ref:QString(QChar ch)ではなく、値渡しですが、POD型ではなくクラス自体(class QChar)です。なぜそれが渡されるのですか?なぜQtコードのQCharがconst参照の代わりに値によって渡されるのですか?
答えて
Qt 5.6.2のQChar
クラスには、単一のデータメンバー、unsigned short
があります。したがって、ほとんどのプラットフォームでsizeof(QChar)
は2
になります。これは通常のポインタ(通常4または8バイト)よりも小さくなります。
したがって、QChar
は他の基本タイプと同じように扱うことができます。 Qt APIではchar
の代わりに使用されているため、実際にはそのように動作するように設計されています。
const refを渡す理由は効率であり、大きなオブジェクトには理にかなっています。値を渡すことは、このような状況では高価なコピーを意味します。したがって、追加の間接参照のためにそれをトレードします(これは、参照が通常ポインタで実装されるためです)。推論が成立しない基本的な型の場合。コピーは安いので、値渡しと間接参照の追加を避ける方が効率的です。
QChar
は2バイトであるのに対し、ポインタは4バイトまたは8バイトであるため、より効率的です。
しかし、それは完全な話ではありません。現代のマシンは、アーキテクチャ固有のポインタを1バイト渡すのと同じ時間を要し、最終的にはすべて32ビットまたは64ビットのレジスタで終了します。これは当時の事実ではなく、大きな整数を渡すのにマシンが非常に遅かったのは間違いありませんが、ポインタの長さは4バイトまたは8バイトではありませんでした。したがって、せいぜい、30年前のような16ビットマシンではなく、参照ではなく値でバイトを渡すと言っても、ある程度の利益があります。
実際に渡された場合の参照は単なるポインタであることを覚えておいてください。したがって、非効率性は余分なインダイレクション層を使用することと関連があります。なぜオブジェクト自体を渡すことができるときに、メモリ内の他の場所のオブジェクトを探すためにポインタを渡すのはなぜですか?少なくとも理論的には。
実際には、コンパイラは最適化が非常に優れています。ホットスポットで呼び出すことができ、実際のオーバーヘッドにつながる可能性がある関数は、呼び出されるのではなくコンパイラによってインライン展開されるため、パラメータが渡されることはありません。値渡しと参照渡しという2つの簡単な関数を比較すると、まったく同じマシンコードになります。
実際には問題ではないにしても理論的に意味をなされるので、値渡しとなります。そしてあなたがタイピングに少しを保存するので。関数外のオブジェクトを変更する場合は、参照渡しが必要です。
- 1. なぜ値の代わりにオブジェクト参照が表示される
- 2. 自己参照でこれの代わりに自己なぜですか?
- 3. 配列の参照の代わりに値を渡すにはどうすればよいですか?
- 4. const参照で一時的に渡すときにコピーコンストラクタが呼び出されるのはなぜですか?
- 5. 値の代わりに参照によるカラー(構造)オブジェクトの割り当て
- 6. getter関数の代わりにconst参照を使用できますか?
- 7. catch(...)によってキャッチされる代わりに_CxxUnhandledExceptionFilterが呼び出されるのはなぜですか?
- 8. なぜこのプログラムは参照によってパラメータを渡すのですか?
- 9. カスタムオブジェクトが値渡しであるか、フラグメントとアクティビティの参照によって渡されますか?
- 10. 弱い参照プロパティに代わってunsafe_unretained修飾子を割り当てるのはなぜですか?
- 11. 値によって戻り値がconst参照に割り当てられました
- 12. 値渡しまたはconstへの参照によってstd :: chrono :: durationを渡しますか?
- 13. const参照によって関数にuninitalized値を渡すときに、g ++が警告を報告しないのはなぜですか?
- 14. OpenCVはconst参照に代入されますか?
- 15. Pythonの実践:「参照」によって渡される引数
- 16. Javaの戻り参照値(または参照によって)
- 17. なぜgtk +が参照渡しになるのですか?
- 18. const&の代わりにmove(&&)が呼び出されるのはなぜですか?
- 19. Lが(他の文字の代わりに)参照型の接頭辞となるのはなぜですか?
- 20. 比較関数でconst参照VS非const参照対値渡し
- 21. エクスポートされたconst変数を参照するconst変数のなかで、値が0になるのはなぜですか?
- 22. オーバーロード解決時にconst左辺参照がconst rvalue参照よりも優先される理由
- 23. RWCString - 値渡しまたはconst参照
- 24. 参照によって渡されたC++ベクトルが変更されない
- 25. なぜ `std :: initializer_list`は値によって渡されるのですか?
- 26. のみの変数が参照によって渡されるべき - はsocket_select()
- 27. 代入演算子をconst参照または値で渡す必要がありますか?
- 28. なぜ "char *"の代わりに "const char * const * argv"を使用するのですか?
- 29. 照会で最大値の代わりに複数の行が返される
- 30. のJava:によって値パスまたは参照渡し
「QChar」が「** 16ビット** Unicode文字」を扱うことを考慮すると、クラス内のデータはおそらくコピーが簡単であるほど十分に小さいでしょう(16ビットなど)。典型的な現代的(32ビットまたは64ビット)のシステムでは、 'int'は32ビットであり、問題なくコピーされ、値渡されます。 –
値のセマンティクスが優れているため、パフォーマンスへの影響はありません。 –
必須読み込み:http://www.macieira.org/blog/2012/02/the-value-of-passing-by-value/ – peppe