如何使STL对与一种类型的“空结构”只占用其他类型的空间?

时间:2012-12-04 17:04:50

标签: c++ data-structures

我正在处理一个模板化的键/值存储类,它需要键和值类型,并在内部将它们存储为std::pair。但是,我发现了一个案例,我只想存储一个键,并仍然利用这个类的索引。我需要完全重构这个东西来处理只有一个键而不是一个键/值对(或浪费大量的空间),所以我想知道是否有办法让std::pair对象采用一个空结构(或其他东西),只占用对中相同数量的空间。

我试过这个:

struct EmptyStruct
{
};

跑了这个:

typedef std::pair<int, EmptyStruct> TestPair;
std::cout << sizeof(TestPair) << " vs " << sizeof(int) << "\n";

但得到了这个输出:

8 vs 4

在启用了优化的“发布”模式下的VC ++ 2012中,包括/ O1“最小化”。

有没有办法在std::pair的上下文中将结构视为“无大小”?

4 个答案:

答案 0 :(得分:7)

您不能使用std::pair,而是使用Boost compressed_pair

在您开始使用压缩编写自己的完全符合pair模板之前,请注意这比看起来更难。

答案 1 :(得分:4)

  

有没有办法让结构得到考虑&#34;无大小的&#34;在std :: pair的上下文中?

否:因为类的单独实例必须具有不同/可区分的地址......所以最小(非零)大小。

答案 2 :(得分:1)

使用std::pair无法做到这一点,但创建自己的结构相当容易 - compressed_pair这样做:只有在其中任何一种类型为空而只保留一个成员时才专门化模板

有一个库 - SeqAn - 有such a type

答案 3 :(得分:1)

如果第二种类型为pair

,您可以专门设置EmptyStruct不实际存储值