std::pair与只有两个成员的std::tuple的区别

Difference between std::pair and std::tuple with only two members?

本文关键字:std 成员 两个 tuple 区别 pair      更新时间:2023-10-16

只有两个成员的std::pairstd::tuple有区别吗?(除了std::pair需要两个或只有两个成员,tuple可以有或多或少…)

有一些区别:

  1. std::tuple不需要成为标准布局。如果TY都是标准布局,则每个std::pair<T, Y>都是标准布局。

  2. 获取pair的内容比获取tuple的内容要容易一些。您必须在tuple情况下使用函数调用,而pair情况只是一个成员字段。

std::tuple的名称较长(多一个字符)。这些字符更多是用右手打字,所以对大多数人来说更容易打字。

也就是说,std::pair只能有两个值,而不是0、1、3或更多。两个值。然而,元组对值的数量几乎没有语义限制。因此,如果您确实想要指定一对值,那么std::pair是一种更准确、类型安全的类型。

这是一个非常晚的答案,但请注意,因为std::pair是用成员变量定义的,所以不能使用空基类优化来优化它的大小(firstsecond必须占用不同的地址,即使其中一个或两个都是空类)。second_type的对齐要求加剧了这种情况,所以在最坏的情况下,std::pair的大小基本上是它需要的两倍。

std::tuple只允许通过辅助函数进行访问,因此如果其中一个类型为空,则可以从其中一个类型派生,从而节省开销。GCC的实现,至少,肯定做到了这一点…你可以通过标题来验证这一点,但这里也有证据

请注意,在c++ 17中,可以使用相同的接口从具有两个元素的pair和tuple中读取数据。

auto [a, b] = FunctionToReturnPairOrTuple();

不需要使用get<>:)

无论如何,我发现std::tuple的GDB输出阅读起来要困难得多。显然,如果您需要两个以上的值,那么std::pair将无法工作,但我确实认为这是支持结构体的一点。

也许值得注意的是,cppreference声明:

" pair是具有两个元素的std::元组的特殊情况。"