c++ - 为什么当 int array[n] 无效时 new int[n] 有效?

标签 c++ arrays

对于以下代码:

foo(int n){
    int array[n];
}

我了解这是无效的语法,并且它是无效的,因为 c++ 标准要求在编译时设置数组大小(尽管某些编译器支持以下语法)。

但我也理解以下是有效的语法:

bar(int n){
    int *array = new int[n];
}

我不明白为什么允许这样做,这与创建一个在运行时确定大小的数组不一样吗?这样做是一种好习惯,或者如果我需要这样做,我应该使用 vector 吗?

最佳答案

这是因为前者分配在栈上,而后者分配在堆上。

当您在堆栈上分配某些东西时,了解对象的大小对于正确构建它至关重要。 C99 允许在运行时指定大小,这在构建和拆除上述堆栈时引入了一些复杂性,因为您无法在编译时计算其大小。为了在程序执行期间执行所述计算,必须发出机器代码。这可能是该功能未包含在 C++ 标准中的主要原因。²

相反,堆没有固定的结构,顾名思义。可以分配任何大小的 block ,没有特定的顺序,只要它们不重叠并且您有足够的(虚拟)内存¹。在这种情况下,在编译时知道大小并不重要。

另外,请记住堆栈的大小是有限的,主要是为了在无限递归耗尽所有可用内存之前检测它们。通常限制固定在 1MB 左右,而您很少达到该限制。除非你分配大对象,否则应该放在堆中。

至于你应该使用什么,可能是 std::vector<int> .但这真的取决于你想要做什么。

还要注意 C++11 有一个 std::array类,其大小必须在编译时知道。 C++14应该已经引入了std::dynarray ,但由于在编译时未知大小的堆栈分配方面还有很多工作要做,所以它被推迟了。


¹ 出于性能原因,通常按顺序分配 block ,但这不是必需的。

² 正如所指出的,在编译时知道大小并不是硬性要求,但它使事情变得更简单。

关于c++ - 为什么当 int array[n] 无效时 new int[n] 有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27495806/

相关文章:

c++ - WinLamb错误: illegal member initialization

java - 理解合并排序的栅栏处理问题

arrays - 在 Laravel Controller 中创建数据数组

javascript - knockout js,向数组添加额外元素

Javascript:在数组中保存重复项的索引

Java 数组被覆盖

c++ - 为什么在堆栈上使用变量时 initstate_r 崩溃

c++ - 匿名函数, "Parse Issue: Expected Expression"

c++ - 在 OpenGL : Will not make Blank Screen (Makes infinite copies instead) 中打开一个窗口

c++ - 如何用定时器绘制文字?