2

我正在处理一个需要键和值类型的模板化键/值存储类,并将它们在内部存储为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“最小化大小”。

有没有办法在 a 的上下文中使结构被认为是“无大小的” std::pair

4

4 回答 4

7

您不能使用 Boost 来做到这一点std::pair,而是使用Boostcompressed_pa​​ir

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

于 2012-12-04T17:09:25.077 回答
4

有没有办法在 std::pair 的上下文中使结构被认为是“无大小的”?

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

于 2012-12-04T17:07:40.483 回答
1

没有办法做到这一点,std::pair但创建自己的结构相当容易 - <code>compressed_pa​​ir 这样做:如果任一类型为空以仅容纳一个成员,只需专门化模板即可。

有一个库——SeqAn——有这样的类型

于 2012-12-04T17:09:16.577 回答
1

如果第二种类型是,您可能会专注pair于不实际存储价值EmptyStruct

于 2012-12-04T17:10:16.443 回答