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つの簡単な関数を比較すると、まったく同じマシンコードになります。
実際には問題ではないにしても理論的に意味をなされるので、値渡しとなります。そしてあなたがタイピングに少しを保存するので。関数外のオブジェクトを変更する場合は、参照渡しが必要です。
「QChar」が「** 16ビット** Unicode文字」を扱うことを考慮すると、クラス内のデータはおそらくコピーが簡単であるほど十分に小さいでしょう(16ビットなど)。典型的な現代的(32ビットまたは64ビット)のシステムでは、 'int'は32ビットであり、問題なくコピーされ、値渡されます。 –
値のセマンティクスが優れているため、パフォーマンスへの影響はありません。 –
必須読み込み:http://www.macieira.org/blog/2012/02/the-value-of-passing-by-value/ – peppe