4 回答
TA贡献10条经验 获得超7个赞
To sum up,新式的"变长数组",相对于malloc所分配出的"动态数组",它不能解决一些问题,包括但不限于:
1. 爆栈。malloc分配是在堆区,堆区向来慷慨大方能给多少给多少,可是"变长数组"仍然是在栈上分配的,开大了还是会爆栈。
2. 虽说"变长数组"可以运行期指定大小,但是大小一旦指定就不可变。你还是没办法用它实现vector(或者类似的结构)。
3. 自己管内存。因为"变长数组"仍然是栈上分配的,栈下生,栈下死。
如果反过来的话,"动态数组"只能一定程度上代替"变长数组"。
原因之一是另一位答主提到过的,某些情况下根本就没有"堆",也没有动态内存分配。
另一方面堆分配比较耗时,频繁申请释放还可能会产生内存碎片。
TA贡献1条经验 获得超1个赞
VLA的目的就是数组的长度是由一个变量指定的,而非常数。而动态数组,则是数组长度可以随需求变化(扩充)。
VLA目前在MSVC/GCC上的实现全部都是利用到了alloca() ,在栈上动态申请一块内存(移动栈指针),当函数返回时,栈指针回归外一层函数时的状态,因而alloca() 分配的内存得以释放。
实际工程中不推荐使用VLA。原因如下:
若数组长度很大,有造成爆栈的危险。OS给进程的栈的大小是有限的。
使用alloca()后会造成部分与栈操作有关的编译器优化失效。
因此,若数组长度有可能很大,请直接在堆上分配避免爆栈。
若数组长度有个确定的上限值,可直接用那个上限值来申请栈空间
TA贡献12条经验 获得超8个赞
变长数组一般是在栈上分配,动态数组一般是在堆上分配。
变长数组在函数返回之后声明周期就结束了,而动态数组需要手动free掉。
变长数组使用多了容易栈溢出,而且它在c11里只是可选特性,和标准 C++ 也不兼容,所以不建议过多使用。
- 4 回答
- 0 关注
- 8315 浏览
添加回答
举报