我知道手动动态内存分配通常是一个坏主意,但它有时比使用std::vector
更好吗?
举一个粗略的例子,如果我必须存储一个n
整数数组,其中n
<= 16,比如说。我可以使用
int* data = new int[n]; //assuming n is set beforehand
或使用矢量:
std::vector<int> data;
使用std::vector
绝对是一个更好的主意吗?或者是否有实际情况可以手动分配动态内存,以提高效率?
答案 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
。见这些:
希望有所帮助。