哪种方式更好用C ++创建一个固定长度的数组?

时间:2015-06-25 01:38:12

标签: c++ arrays

假设我已经知道要创建的数组的大小。让它为N。

int A[N];
int *A = new int[N];

哪种方式更好/更快?为什么?

5 个答案:

答案 0 :(得分:2)

int a[N];

如果N不是constexpr,则这在某些编译器下是合法的,通常是启用了语言扩展,或者是C ++ 14编译器。 ("可变长度数组")

注意这被认为是" C语法"现代,首选的方法是:

std::array<int, N> a;

这会在堆栈上创建一个N整数的数组。如果N * sizeof(int)是&gt; =剩余的堆栈大小,则可能会出现问题。

但是:因为它是一个本地对象,它具有自动生命周期 - 当a超出范围时它会消失。在堆栈上分配内存也非常便宜。

第二种变体:

int* a = new int[N];

不需要MSVC +语言扩展也不需要C ++ 14编译器,这将从堆中分配内存等同于sizeof(int) * N

它没有自动生命周期 - 完成后你需要delete[]内存。在堆上分配可能很昂贵,尤其是在多线程应用程序中。

答案 1 :(得分:0)

可能存在程序的内存需求只能在运行时确定的情况。然后你应该使用:

int *A = new int[N];  //it's dynamic memory. Mean it can be change at runtime.

否则你应该使用:

int A[N];

答案 2 :(得分:0)

哪个更快:

int A[N];更快,因为它可以存储在运行时堆栈中,并且在进入函数时它只会将堆栈指针更改为更大的数字以分配空间。

int *A = new int[N];速度较慢,因为你必须花时间找一个足够大的连续内存块。此外,它不太可能位于计算机存储的易于访问的部分。

有关详细信息,请参阅此related stack overflow question

哪个更好:

关于哪一个&#34;更好&#34;总的来说,这取决于具体情况。 有关详细信息,请参阅this stack overflow question

答案 3 :(得分:0)

编译时数组:C ++ 11有一个名为std :: array的新容器,类似于boost :: array,类似于标准容器,可以替换传统的C数组。
运行时数组:向量是一个不错的选择,您可以在创建时保留其大小。其他序列容器也可以是数组。

答案 4 :(得分:0)

当N非常大时,你应该使用动态内存分配,否则会产生堆栈溢出异常。