使用std :: vector的开销?

时间:2013-03-08 12:35:55

标签: c++ stdvector dynamic-memory-allocation

我知道手动动态内存分配通常是一个坏主意,但它有时比使用std::vector更好吗?

举一个粗略的例子,如果我必须存储一个n整数数组,其中n <= 16,比如说。我可以使用

实现它
int* data = new int[n]; //assuming n is set beforehand

或使用矢量:

std::vector<int> data;

使用std::vector绝对是一个更好的主意吗?或者是否有实际情况可以手动分配动态内存,以提高效率?

7 个答案:

答案 0 :(得分:12)

最好使用std::vector / std::array,至少在您最终证明(通过分析)T* a = new T[100];解决方案相当快之前在你的具体情况。这不太可能发生:vector / array是一个普通旧数组周围的极薄层。使用vector::at进行边界检查会产生一些开销,但您可以使用operator[]来解决这个问题。

答案 1 :(得分:8)

我无法想到动态分配C风格的任何情况 矢量有意义。 (我一直在C ++工作超过25岁 多年了,我还没有使用new[]。)通常,如果我知道的话 预先确定大小,我将使用类似的东西:

std::vector<int> data( n );

获取已经大小的向量,而不是使用push_back

当然,如果n非常小并且在编译时已知, 我将使用std::array(如果我可以访问C ++ 11),甚至是 一个C风格的数组,只需在堆栈上创建对象 没有动态分配。 (这种情况似乎很少见 我工作的代码;小的固定大小的阵列往往是成员 类。偶尔使用C风格的数组。)

答案 2 :(得分:4)

如果您事先知道大小(特别是在编译时),并且不需要std::vector的动态重新调整大小的能力,那么使用更简单的东西就可以了。

但是,如果你有C ++ 11,那么最好是std::array,否则最好是boost::scoped_array

我怀疑除非显着减少代码大小或某些内容,否则效率会有很大提升,但无论如何它都更具表现力。

答案 3 :(得分:4)

您应尽量避免在C中使用C++ - 样式数组。 STL提供的容器通常足以满足各种需求。想象一下数组的重新分配或从中间删除元素。容器可以防止你处理这个问题,而你必须自己处理它,如果你没有这样做一百次,那么它很容易出错。
当然,如果您正在处理可能无法处理STL - 容器的低级别问题,则会例外。

关于这个话题已经有过一些讨论。请参阅SO上的here

答案 4 :(得分:3)

  

使用std :: vector绝对总是一个更好的主意,或者是否存在实际情况,手动分配动态内存会更好,提高效率?

叫我一个傻瓜,但99.9999 ...%的时候我会使用标准容器。默认选项应为std::vector,还应为std::deque<> could be a reasonable option sometimes。如果在编译时已知大小,请选择std::array<>,它是C风格数组的轻量级安全包装,它引入了零开销。

标准容器公开成员函数以指定初始保留的内存量,因此您不会遇到重新分配的麻烦,并且您不必记住delete[]您的阵列。老实说,我不明白为什么要使用手动内存管理。

效率不应该是一个问题,因为您有投掷和非投掷成员函数来访问所包含的元素,因此您可以选择是否支持安全性或性能。

答案 5 :(得分:2)

std :: vector 可以使用size_type参数构造,该参数使用指定数量的元素实例化向量并执行单个动态分配(与数组相同),也可以使用< em>保留以减少使用时间内的重新分配次数。

答案 6 :(得分:0)

在编译时已知n,那么您应该选择std::array

std::array<int, n> data; //n is compile-time constant

如果在编译时不知道n,或者数组可能在运行时增长,那么请转到std::vector

std::vector<int> data(n); //n may be known at runtime 

或者在某些情况下,您可能更喜欢在某些情况下比std::deque更快的std::vector。见这些:

希望有所帮助。