【问题标题】:What's the difference between a tuple and a compressed_pair?元组和压缩对有什么区别?
【发布时间】:2013-04-24 18:06:15
【问题描述】:

我看到两者都用于相同的目的,但我想知道结果会有什么不同(如果有的话)以及为什么要使用它。

参考文档:compressed_pairtuple

【问题讨论】:

  • std::pair 是两个元素的元组。元组可以是任意数量的元素(任何类型)。我想compressed_pa​​ir 上的文档可以解释其他任何事情。 (但我认为它会进行一些与存储相关的优化)
  • @GRAYgoose124:只有一个,空基优化
  • 好吧,元组不是已经提供了必要的“压缩”,即使是两个元素?
  • @rubenvb No. compressed_pair 的“压缩”实际上只是 empty base class optimization
  • @DavidRodríguez-dribeas:元组可以被压缩,但不是必须的。你不能指望它。

标签: c++ boost tuples


【解决方案1】:

C++ 要求所有 complete types 的大小大于 0。如果一个类型可能的大小为 0,数组索引和其他指针数学就会出错。

class EmptyClass { };

std::cout << sizeof( EmptyClass );  // Prints "1" (typically)

boost::compressed_pair 是一个包含两个元素的元组,对于只有大小为 1 的类型不需要额外的存储空间,因为禁止大小为 0。

if ( sizeof( compressed_pair<int,EmptyClass> ) == sizeof(int) )
{
   std::cout << "EmptyClass was compressed.";  // (This will print)
}

这是通过Empty Base Optimization 实现的。这两种类型都放在一个类包装器中,如果一种类型是“空的”,则该类成为另一个的父类。

【讨论】:

  • 你为什么要占用compressed_pair类的大小。它不是返回一个可以通过::[name_of_type] 访问的类型吗?…
  • @0x499602D2(除非我很困惑)它说明EmptyClass 的存在不会增加compressed_pair 的整体大小。
  • compressed_pair 的大小怎么可能和int 的大小一样,我基本上是想说。
  • @0x499602D2 哦——在这种情况下,它通过将每种类型放入一个包装器类中并让int 包装器继承自EmptyClass 包装器来实现。看到这个:en.wikibooks.org/wiki/More_C%2B%2B_Idioms/…
  • 你也可以通过[[no_unique_address]]从C++20开始实现同样的优化。 (Visual Studio 使用扩展名而不是 [[msvc::no_unique_address]]。请参阅 this
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-06
  • 2014-07-18
  • 2019-08-12
  • 1970-01-01
  • 1970-01-01
  • 2010-10-12
相关资源
最近更新 更多