3

我在 64 位机器上使用 Linux,我使用 g++4.8。sizeof应用于std::vector返回的运算符:

sizeof(std::vector<float>) = 24
sizeof(std::vector<double>) = 24
sizeof(std::vector<long double>) = 24

我的问题是:基于我的应用程序永远不需要超过1 GB元素的向量这一事实,有什么方法可以创建一个尺寸更小的向量?因为最佳情况下,我可以有一个 16 字节的向量:指向开头的指针(8 字节)、当前大小(4 字节)和当前容量(4 字节)。我是否必须从头开始重新编码自己的向量,还是可以使用自定义分配器减小大小?

这个大小对我来说非常重要,因为我在内存超过 100 TB 的超级计算机上工作,而我在基本课程中获得的每个字节最终都可以节省几 TB 的内存。

4

4 回答 4

2

不,你不能。

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

所以如果你真的需要一个向量来使用某种紧凑的指针表示或其他东西,你将不得不自己实现一个。

标准库容器对于大多数用途来说是很好的默认值。但是对于那些有特殊需求的人,您可能必须用其他东西代替它们。这里似乎就是这种情况。

于 2013-05-22T15:45:58.237 回答
1

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

于 2013-05-22T15:44:50.797 回答
0

这个大小是内置在vector's 实现中的,你不能方便地减小它(在 32 位模式下构建当然会因为指针大小更小而减小大小)。

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

于 2013-05-22T15:55:04.283 回答
0

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

假设您有一个大小为 100 万的双向量。大小和容量数据总共仍将占用 8 个字节,与向量保存的主要数据相比,它是相当微小的。

如果您经常使用从 1 到 50 的非常小的向量,那么您可以为数组编写一个包装器并使用它,而标准向量可能不是小型数据组的好选择。我不知道您的 RAM 是 100TB 还是只是您的硬盘容量,但保留许多小型数据结构可能不是一个好主意,因为它可能会导致严重memory fragmentation的 s。

于 2013-05-22T16:04:26.343 回答