如何使一种类型的STL对只占用另一种类型的空间"empty struct"?

How to make STL pair with one type an "empty struct" only take up the space of the other type?

本文关键字:类型 空间 另一种 empty struct 种类 何使一 STL      更新时间:2023-10-16

我正在处理一个模板化的键/值存储类,它需要键和值类型,并将它们作为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的上下文中被认为是"无大小的"?

你不能用std::pair来做到这一点,但用 Boost compressed_pair 来做到这一点。

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

有没有办法使结构在 std::p air 的上下文中被认为是"无大小的"?

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

没有

办法用std::pair做到这一点,但创建自己的结构相当容易——compressed_pair这样做:如果其中一种类型为空,只需专门化模板以仅容纳一个成员。

有一个库 - Seqan - 有这样的类型。

如果

第二种类型是EmptyStruct,你可以专门pair不实际存储价值