我已经看到两者都用于相同的目的,但是我不知道结果会如何不同(如果有的话)以及为什么将其全部使用。

对文档的引用: compressed_pair tuple

最佳答案

C++要求所有类型的大小都必须大于0。如果类型的大小可以为0,则数组索引和其他指针数学都会出错。

class EmptyClass { };

std::cout << sizeof( EmptyClass );  // Prints "1" (typically)
compressed_pair是由两个元素组成的元组,该元素经过优化,因为大小为1的一种类型(因为禁止大小为0),因此不需要额外的存储空间。
if ( sizeof( compressed_pair<int,EmptyClass> ) == sizeof(int) )
{
   std::cout << "EmptyClass was compressed.";  // (This will print)
}

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

07-24 14:09