17

我知道手动动态内存分配通常是一个坏主意,但有时它是否比使用更好的解决方案std::vector

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

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

或使用向量:

std::vector<int> data;

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

4

7 回答 7

16

std::vector使用/总是更好std::array,至少在您可以最终证明(通过分析)T* a = new T[100];解决方案在您的特定情况下要快得多之前。这不太可能发生:vector/array是一个非常薄的层,围绕着一个普通的旧数组。使用 进行边界检查会产生一些开销vector::at,但您可以使用operator[].

于 2013-03-08T12:40:56.590 回答
10

我想不出动态分配 C 样式向量的任何情况。(我已经在 C++ 中工作了超过 25 年,但我还没有使用过new[]。)通常,如果我事先知道大小,我会使用类似的东西:

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

得到一个已经大小的向量,而不是使用push_back.

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

于 2013-03-08T12:58:02.880 回答
4

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

std::array但是,如果您有 C++11 或其他类似的东西,那么最好是这样boost::scoped_array

我怀疑除非它显着减少代码大小或其他东西,否则效率会大大提高,但它更具表现力,无论如何都是值得的。

于 2013-03-08T12:38:42.330 回答
4

您应该尽可能避免使用C-style-arrays C++STL提供通常足以满足各种需要的容器。想象一下对数组进行重新分配或从其中间删除元素。容器使您免于处理此问题,而您必须自己处理它,如果您没有这样做一百次,那很容易出错。
当然,一个例外是,如果您正在解决可能无法处理 -containers 的低级问题STL

已经有一些关于这个话题的讨论。请参阅此处

于 2013-03-08T12:41:46.193 回答
3

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

称我为傻瓜,但 99.9999...% 的时间我只会使用标准容器。默认选择应该是std::vector,但std::deque<>有时也可能是一个合理的选择。如果在编译时知道大小,请选择std::array<>,这是一个轻量级、安全的 C 样式数组包装器,它引入了零开销。

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

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

于 2013-03-08T12:42:30.093 回答
2

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

于 2013-03-08T12:43:21.900 回答
1

Inn在编译时是已知的,那么您应该选择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某些情况下更快。见这些:

希望有帮助。

于 2013-03-08T12:42:00.557 回答