假设我已经知道要创建的数组的大小。让它为N。
int A[N];
int *A = new int[N];
哪种方式更好/更快?为什么?
答案 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非常大时,你应该使用动态内存分配,否则会产生堆栈溢出异常。