使用自定义分配器减小向量的大小?

时间:2013-05-22 15:40:35

标签: c++ c++11 sizeof stdvector allocator

我在64位机器上使用Linux而且我使用的是g ++ 4.8。 应用于sizeof的{​​{1}}运算符返回:

std::vector

我的问题是:基于我的应用程序永远不需要超过sizeof(std::vector<float>) = 24 sizeof(std::vector<double>) = 24 sizeof(std::vector<long double>) = 24 个元素的向量这一事实,有没有办法创建一个更小的向量?因为最佳,我可以有一个16字节的向量:指向开头的指针(8字节),当前大小(4字节)和当前容量(4字节)。我是否必须从头开始重新编码自己的矢量,或者我可以使用自定义分配器来减小尺寸吗?

这个大小对我来说非常关键,因为我使用超过100 TB内存的超级计算机,我可以在基本类上获得的每个字节最终可以节省几TB的内存。

4 个答案:

答案 0 :(得分:2)

不,你不能。

分配器的最初想法是,他们可以为数据定义指针和引用类型的对象。但是,这不再是真正允许的了; allocator<T>::pointer必须为T*,并且可以自由地允许容器假定它是。

因此,如果您真的需要一个向量来使用某种紧凑的指针表示或某种东西,那么您将不得不自己实现一个。

标准库容器是大多数用途的良好默认值。但对于那些有特殊需求的人,你可能不得不用其他东西替换它们。这似乎就是这种情况。

答案 1 :(得分:1)

传统上使用三个指针(存储的开始,结束和结束)实现向量。 缩小它们的唯一方法是改变内部表示。

答案 2 :(得分:0)

此大小内置于vector的实现中,并且您无法方便地减少(由于较小的指针大小,在32位模式下构建当然会减小大小)。

也许如果你在代码中使用了数万亿vectors,你可能想尝试减少那个号码(将它们组合成一个更大的vector?)而不是试图削减每个字节的几个字节。

答案 3 :(得分:0)

有一些事情需要澄清:当矢量大小增加时,矢量大小和容量数据变得相对非常小。

假设你有一个100万的双向量。大小和容量数据仍然总共占用8个字节,与矢量保持的主数据相比非常微小。

如果您经常使用非常小的向量(例如1到50),那么您可以为数组编写包装并使用它,并且std向量可能不适合小型数据组。我不知道你的RAM是100TB还是仅仅是你的硬盘驱动器容量,但保留许多小型数据结构可能不是一个好主意,但它可能导致严重的memory fragmentation