静态和动态内存分配有什么区别?

时间:2017-03-03 02:11:01

标签: c++ dynamic-memory-allocation

我看到了这段代码:

int n;
cin>>n;
int c[n];

与此相比有什么不同

int *c=new int[n];

3 个答案:

答案 0 :(得分:1)

第一个在c ++中无效,因为需要在编译时知道大小,因为您的数据将存储在堆栈上并且范围有限。

后者为堆上的对象分配内存,并将持续存在,直到手动删除或程序执行停止。

答案 1 :(得分:0)

在第一个例子中:

int n;
cin >> n;
int c[n];

此代码只是声明一个变量n,接受来自用户的存储在n中的整数值,并声明一个大小为n的整数数组。

这里的问题是,如果编译器不支持,你的代码中不能有一个可变长度数组,因为在c ++中不允许这样做。但是,现代编译器,如更高版本的gcc编译器,支持可变大小的数组,因此,允许变量数组克服c ++不支持它们的障碍。

我不知道支持变量数组的gcc编译器的所有版本,但我尝试过gcc版本4.6.3,它支持变量数组。

现在,转到第二个例子,

int *c = new int[n];

这是一个完全不同的概念。这里,int *c分配内存以保存int类型的单个元素。然后new int [n]在int类型的内存中分配n个元素的块,第一个元素的地址存储在c中。其中,c指向5个整数的数组。如需进一步阅读,请访问:Dynamic Memory

答案 2 :(得分:0)

第一个例子

在第一个示例中,您实例化了一个名为可变长度数组的东西。 VGA未在C ++标准中定义,因此它们不属于该语言。它们有时被各种编译器启用为扩展。

VLA具有自动存储持续时间,这意味着这样的数组在代码块的开头分配并在最后解除分配。

通常它们被分配在堆栈上(如果它们适合)但是不能保证。因此,与动态内存分配(第二个示例)相比,通常它们将具有更小的分配/解除分配成本。

通常 VLA允许sizeof使用sizeof(VLA),而array_size * sizeof(type) 通常返回gcc。对于应用了编译标记-std=c++14的{​​{1}},情况属实。

您可能已经注意到很多通常是 - 事实上,由于VLA没有定义VLA,您必须深入了解您使用的编译器的规范。因此,C ++的最佳实践 - 不使用VLA

第二个例子

在第二个示例中,您执行动态内存分配。完成此操作后c指向新分配的大小为n * sizeof(int)字节的内存块的开头。

c 动态存储时间意味着它是由您分配的,必须由您取消分配(在这种情况下使用delete[] c;

如上所述,堆上的分配/解除分配成本更高。

注意:

在C ++中,您应尽可能尝试使用std::vector<T>。它更安全,可以随着你添加新元素而增长,而且速度也不会慢得多。