13

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

对文档的引用:compressed_pairtuple.

4

1 回答 1

23

C++ 要求所有完整类型的大小都大于 0。如果一个类型的大小可以为 0,那么数组索引和其他指针数学就会出错。

class EmptyClass { };

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

Aboost::compressed_pair是一个由两个元素组成的元组,对于一种只有 1 大小的类型不需要额外的存储空间,因为禁止使用 0 的大小。

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

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

于 2013-04-24T18:24:10.763 回答