メンバーが 2 つだけのstd::pair
と の間に違いはありますか? ( 2 つだけのメンバーを必要とし、多かれ少なかれ持つことができるstd::tuple
という明白なことに加えて...)std::pair
tuple
6 に答える
いくつかの違いがあります:
std::tuple
標準では、 standard-layoutである必要はありません。とstd::pair<T, Y>
の両方が標準レイアウトの場合、すべてが標準レイアウトです。T
Y
a
pair
よりも aの内容を取得する方が少し簡単tuple
です。ケースは単なるメンバーフィールドですがtuple
、ケースでは関数呼び出しを使用する必要があります。pair
しかし、それはそれについてです。
Anstd::tuple
の名前が長くなります (1 文字余分に)。これらの文字の多くは右手で入力されるため、ほとんどの人が入力しやすくなっています。
つまり、std::pair
0、1、3、またはそれ以上ではなく、2 つの値しか持てません。2 つの値。ただし、タプルには、値の数に関する意味上の制限はほとんどありません。したがって、値のstd::pair
ペアを実際に指定する場合は、より正確でタイプ セーフな型を使用できます。
これは非常に遅い回答ですが、メンバー変数で定義されているため、空の基本クラスの最適std::pair
化を使用してそのサイズを最適化することはできません(一方または両方が空のクラスであっても、個別のアドレスを占有する必要があります) 。これは、アライメント要件が何であれ悪化するため、最悪の場合、結果は基本的に必要なサイズの 2 倍になります。first
second
second_type
std::pair
std::tuple
ヘルパー関数を介したアクセスのみを許可するため、どちらか一方が空の場合、どちらかの型から派生させることができ、オーバーヘッドを節約できます。GCC の実装は、少なくとも、間違いなくこれを行います...ヘッダーを調べてこれを確認できますが、証拠としてこれもあります。
価値があるのは、std::tuple の GDB 出力がはるかに読みにくいことです。明らかに、2 つ以上の値が必要な場合、std::pair は機能しませんが、これは構造体を支持するポイントと考えています。