只有两名成员的std::pair
和std::tuple
之间是否存在差异? (除了显而易见的是std::pair
需要两个且只有两个成员且tuple
可能会少一些......)
答案 0 :(得分:67)
存在一些差异:
std::tuple
永远不能通过standard-layout(至少,它不是必需的符合标准)。如果std::pair<T, Y>
和T
都是标准布局,则每个Y
都是标准布局。
获取pair
的内容比tuple
更容易。您必须在tuple
案例中使用函数调用,而pair
案例只是成员字段。
但那是关于它的。
答案 1 :(得分:23)
这是一个非常晚的答案,但请注意,由于std::pair
是使用成员变量定义的,因此无法使用empty base class optimization优化其大小(first
和second
必须占用不同的地址,即使其中一个或两个都是空类)。任何对齐要求second_type
都会加剧这种情况,因此在最坏的情况下,结果std::pair
的大小基本上是其所需的两倍。
std::tuple
仅允许通过辅助函数进行访问,因此如果一个或另一个为空,它可以从任一类型派生,从而节省开销。至少GCC的实现肯定会这样做......你可以通过标题来验证这一点,但也有this作为证据。
答案 2 :(得分:20)
std::tuple
的名称更长(一个额外的字符)。用右手输入更多这些字符,大多数人都更容易输入。
那就是说,std::pair
只能有两个值 - 不是零,一个,三个或更多。两个值。但是,元组对值的数量几乎没有语义限制。因此,如果您确实要指定一对值,std::pair
是一种更准确,类型安全的类型。
答案 3 :(得分:3)
对于它的价值,我发现std :: tuple的GDB输出要难以阅读。显然,如果你需要超过2个值,那么std :: pair将不起作用,但我认为这一点有利于结构。
答案 4 :(得分:1)
请注意,在C ++ 17中,可以使用同一接口从具有两个元素的对和元组中读取数据。
auto [a, b] = FunctionToReturnPairOrTuple();
无需使用get<>
:)
答案 5 :(得分:1)
也许值得注意的是,cppreference 指出:
“一对是具有两个元素的 std::tuple 的特殊情况。”