【问题标题】:The Perfect Pair完美的一对
【发布时间】:2016-06-16 08:11:09
【问题描述】:

受到this question 的启发,我开始思考完美的std::pair 应该是什么样子。压缩对类(例如boost's)提供了一个对,当其中一个类型为空类时,其大小会减小。压缩对需要 getter(first()second())来隐藏具有空类型的成员不存在的事实。

其次,根据C++ docs:“对是元组的一种特殊情况”,但它们被实现为一个单独的类。为什么不使用部分模板特化,例如

template <typename ...Args> class tuple {};
template <typename T1, typename T2> class tuple<T1, T2> {}; // Implements a compressed pair
template <typename T1, typename T2> using pair = tuple<T1, T2>;

此外,为了提供更统一的 API,可以为 pair 重载 std::getstd::set,并放弃 first()second() 访问器。或者一个可以同时拥有:)

问题

  1. 为什么std::pair 不是std::tuple 的特化?

  2. 什么时候可以使用std::pair 而不是压缩对?而且即使有情况,也应该默认是压缩对吗?

  3. 为什么没有压缩元组类?

【问题讨论】:

  • 答案 1 可能是因为 std::pair 在 C++11 中引入 std::tuple 之前很久就已经在标准中了。
  • @JoachimPileborg 好点,但是我认为将std::pair 重写为std::tuple 的特化不会破坏向后兼容性,从而使firstsecond 暴露。虽然这可能会导致更多的混乱而不是它的价值。

标签: c++ templates stl std-pair stdtuple


【解决方案1】:
  1. pairtuple 早了 10 年。由于历史原因和向后兼容性,它作为一个单独的类存在。对它进行重大更改比它的价值更麻烦。如果有人想要包含两个元素的元组,他们可以使用包含两个元素的元组。

  2. 我无法使用非人工示例,我认为唯一真正的原因是使用标准库类,以及与假设 sizeof(pair&lt;A,B&gt;) &gt;= sizeof(A) + sizeof(B) 和类似代码的代码的向后兼容性。

  3. 没有 compressed_tuple,因为 std::tuple 已经在每个标准库实现中执行 EBO。

【讨论】:

  • 感谢您的回答。我玩过tuplepair,这里是my results。有趣的是,pair 从未被压缩,tuple 在 g++ 和 clang++ 上被压缩。所以我的结论是否正确:除非你不需要压缩,否则总是使用tuple 而不是pair?而且 msvc 不值得吗? :)
  • @Judge 您使用的是哪个版本的 msvc?我相信,最新的一个有用于元组的 EBO。我很少需要严重压缩,而且大部分时间我都与 STL 交互,所以通常我使用 pair 除非我有空类并且有数千个实例或总对大小会超过寄存器大小/由于开销超过 50%对齐问题。
  • 我正在使用 msvs 2015 社区版(14.0.25123.00 更新 2)。很公平,但作为默认值,压缩肯定不会受到伤害?除非如你所说,你依赖于它的大小。
  • @Judge 当然不能。我只使用标准库 + auto,所以我有很多对并且缺少 2 元素元组。我不在乎,除非它是一个瓶颈:否则我不太可能显着减少内存占用或执行时间。至于编译器:我对此无能为力。我不使用 msvs,所以我不关注有关它的新闻。我可能是编译器中缺少的功能,或者需要特定的标志,或者其他东西。不过,我相信标准库元组启用了 EBO。
  • 啊,我的错,我没有意识到 tuple 不在 STL 中。好的,谢谢 - 我会深入研究 msvc 编译器功能。
猜你喜欢
  • 2012-10-30
  • 2016-12-02
  • 1970-01-01
  • 1970-01-01
  • 2018-12-27
  • 2012-01-24
  • 1970-01-01
  • 2010-11-17
  • 2010-12-05
相关资源
最近更新 更多