我看到了这段代码:
int n;
cin>>n;
int c[n];
与此相比有什么不同
int *c=new int[n];
答案 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>
。它更安全,可以随着你添加新元素而增长,而且速度也不会慢得多。