矢量与恒定的大小

时间:2010-08-10 05:58:12

标签: c++ arrays static vector

我正在寻找类似于std::vector的C ++数据类型,但没有与动态调整大小相关的开销。容器的大小在其生命周期内保持不变。我考虑使用boost::array,这是不合适的,因为它需要在编译时知道数组的大小,在我的情况下不是这种情况。

5 个答案:

答案 0 :(得分:15)

在使用非标准的任何内容之前,测量动态调整大小是否确实对性能产生任何影响。

提示:使用vector.reserve永远不会有任何数组重新分配。

答案 1 :(得分:10)

如果不重新分配std :: vector,则重新分配没有开销。所以:

  • 构造前面已知大小的std :: vector(std::vector x(100)
  • 构造后调用reserve(n)以确保在重新分配之前至少可以将n个元素推入向量。

答案 2 :(得分:4)

std::vector的动态调整大小功能引起的开销几乎不存在。

如果你需要一个编译时大小的数组,在许多情况下寻找比std::vector更有效的东西确实是个好主意。

但固定运行时大小和动态运行时大小之间的差异可以忽略不计。在这种情况下,std::vector是一个完美的解决方案。

答案 3 :(得分:2)

我使用了基于STLSoft auto_buffer的想法的模板类(我将自己的实现拼凑在Matthew Wilson的不完美的C ++书籍以及STLSoft实现的一些想法中)。它默认在堆栈上(或嵌入在类对象中)分配数组(如果它足够小)(基于您提供的模板参数)。如果运行时分配大于此值,则阵列存储来自堆。

http://www.stlsoft.org/doc-1.9/classstlsoft_1_1auto__buffer.html

所以关于这个类的好处是,对于较小的小尺寸,分配基本上是无操作。

答案 4 :(得分:1)

如果在编译时不知道数组的大小,那么C ++中唯一的选项是动态分配的数组。您可以使用std::vector来保证RAII。正如其他人所说,std::vector s可以调整大小的事实并不意味着你必须调整它们的大小。创建具有正确大小的std::vector,然后不要调用任何可以调整大小的内容。