我正在处理一个模板化的键/值存储类,它需要键和值类型,并在内部将它们存储为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
的上下文中将结构视为“无大小”?
答案 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
不实际存储值