【发布时间】:2012-07-02 14:23:28
【问题描述】:
我有一个将使用数百万个向量的应用程序。
似乎大多数 std::vector 实现使用 4 个指针(_First、_Last、_End 和 _Alloc),在 64 位机器上占用 32 个字节。对于向量的大多数“实际”用例,可能会使用一个指针和两个“无符号整数”字段来分别存储当前大小和分配的大小。忽略支持自定义分配的潜在挑战(而不是假设分配必须通过全局 new & delete 运算符),似乎可以构建一个仅使用 16 个字节(或最坏 24 个字节)的 STL 兼容向量类支持_Alloc指针)。
在我开始编写代码之前,1) 是否有任何我应该注意的陷阱,以及 2) 是否存在开源实现?
【问题讨论】:
-
向量是否相互关联?就像,它们是矩阵中的行吗?如果是这样,您可以应用其他不需要重新实现
std::vector的优化。 -
对我来说听起来像是过早的优化。编写应用程序逻辑,然后,如果向量开销的大小是一个问题,请查看解决方案。
-
您可以考虑一下您的内存使用配置文件,并尝试比一百万个向量更有效地安排它。他们都需要独立成长吗?无法预测它们的大小吗?
-
“我有一个将使用数百万个向量的应用程序” - 哇,您真的需要完全动态地独立调整每个向量的大小吗?听起来像是数据结构重新设计的一个很好的起点。这不仅可以减少整体大小,还可以提高性能,当使用更多的本地化数据而不是为每一小串数字(或其中的任何内容)使用完全不同的内存区域时,虽然我不知道你的潜在问题,也许你真的需要数百万
std::vectors。 -
@DavidRodríguez-dribeas:
capacity()如果在这个意义上使用将是size_t,它与指针的宽度相同。 (所以即使它不是指针,在大小方面它也与指针相同)_Last将与存储capacity()相同(也就是说,_Last是begin()+capacity())第四个指针指向分配器。