2013-04-24 81 views
7

我已经看到两者都用于相同的目的,但我不知道结果会有什么不同(如果有的话)以及为什么这会被使用。元组和compress_pair有什么区别?

对文档的引用:compressed_pairtuple

+2

std :: pair是两个元素的元组。元组可以是任意数量的元素(任何类型)。我可以想象compressed_pa​​ir上的文档可以解释其他任何内容。 (但是我认为它会进行一些与存储相关的优化) – GRAYgoose124 2013-04-24 18:10:52

+0

@ GRAYgoose124:就是那个_empty base optimization_。 – 2013-04-24 18:16:28

+0

那么,即使对于两个元素,是不是会提供必要的“压缩”? – rubenvb 2013-04-24 18:17:22

回答

14

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

class EmptyClass { }; 

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

compressed_pair是优化不要求额外的存储一种类型的,因为0的尺寸是被禁止的仅具有一个尺寸为1两种元素的元组。

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

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

+0

为什么要采用'compressed_pa​​ir'类的大小。它不会返回一个可以通过':: [name_of_type]'访问的类型吗?... – 0x499602D2 2013-04-24 22:02:57

+0

@ 0x499602D2(除非我很困惑)它说明'EmptyClass'的存在不会增加' compressed_pa​​ir'作为一个整体。 – 2013-04-24 22:14:29

+0

'compressed_pa​​ir'的大小如何与'int'的大小相同我基本上是想说。 – 0x499602D2 2013-04-24 22:16:18