如何使一种类型的STL对只占用另一种类型的空间"empty struct"?
How to make STL pair with one type an "empty struct" only take up the space of the other type?
我正在处理一个模板化的键/值存储类,它需要键和值类型,并将它们作为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
不实际存储价值
相关文章:
- 从父命名空间重载类型
- 使用 make 编译 MPI,几个命名空间错误,例如"错误:未知类型名称'使用'?
- 从类型列表中递归删除重复项会导致编译器堆空间错误 (VS2017)
- 如何对命名空间限定类型进行类型定义?
- Boost.Python :C++模板类型匹配的嵌套命名空间
- 如何为缺少预定义运算符而不扩展命名空间"std"的标准类型定义运算符>> (istream &, ...)?
- 如何理解c++中在命名空间内部定义的枚举类型enum
- 为什么找不到使用命名空间中定义的类型实例化的 std::weak_ptr 的重载运算符==?
- C++ ,错误:命名空间'std'中的'shared_ptr'未命名模板类型
- 错误:命名空间"std"中没有名为"invoke_result_t"的类型 GCC-7
- 将数组类型更改为 Int16 会节省存储空间吗?
- 空向量占用的空间是否与指向当前设置为 nullptr 的类型的指针一样多
- 命名空间中的'bad_cast' 'std' 未命名类型错误
- 通过引用传递基元类型(如 int、bool)是否比按值传递有任何加速?还是会恶化时间/空间的使用
- 使用用作类型 C++ 的命名空间
- 加载地址 X 时,对于 Y 类型的对象没有足够的空间
- 命名空间'std'中的'vector'没有模板类型
- 向前删除标题文件中其他名称空间的自定义类型
- C++11 内联命名空间与直接在封闭命名空间中嵌入类型
- 为什么类型特征不适用于命名空间范围内的类型?