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