【发布时间】:2012-12-04 17:04:49
【问题描述】:
我正在处理需要键和值类型的模板化键/值存储类,并将它们在内部存储为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 的上下文中被视为“无大小”?
【问题讨论】:
-
您也可以从相反的方向解决这个问题,将存储类分解并提供两个接口,一个带有 (key,value),另一个只带有 (key)。这是标准库实现中的常用方法,其中
std::map和std::set使用相同的底层平衡树实现,每个都有不同的value_type和比较器。 -
请注意,“最小化大小”不会改变对象的大小,它只会影响生成的代码的大小。类型内部的空间优化必须在库级别完成。
-
正如我在 ChrisW 的回答中提到的,您可以尝试改用
std::tuple,这样可以删除空类型所需的空间。不过,这取决于实施的质量。因为 VS2012 没有正式的可变参数模板(但请查看 Nov 2012 CTP!),它的std::tuple实现已经投入了大量资金。
标签: c++ data-structures