首页 > 代码库 > 有关变长数组(VLA)(转)
有关变长数组(VLA)(转)
1. 变长数组是分配在堆栈上的, 其实从语义的角度也应该是这样, 变长数组还是一个数组, 还是一个局部变量, 在c语言中,
局部变量是分配在堆栈上的, malloc才是分配在堆上面的. 这里面没有不存在什么
内存泄漏, 因为堆栈上的内存是不需要程序员管理的
2. 变长数组和其他变量共同存在于一个作用域之内时, 变长数组是在最后分配的,
也就是处在堆栈的最下面(地址最低). 这也是变长数组不同于普通变量的情况,
普通变量的内存分配是按照定义顺序来的, 先定义的先分配, 但是变长数组不是这样的,
在一个作用域内变长数组都是放到最后分配的, 原因很简单, 变长数组的大小在编译时无
法确定, 所以如果在变长数组后面分配普通变量的空间, 那么对后面普通变量的存取就不
方便了,当然简单的情况可以通过优化解决, 但是如果有很多的变量数组和普通变量混合
在一起的话,优化很难做到很好, 所以把变长数组都放在最后面分配, 是一个比较合理的
办法;
当然, 不是说一定要放在最后, 按照普通的定义顺序来分配空间也是可以的,只是在存取
可变数组后面的变量的时候, 需要首先找到可变数组的起始地址, 然后再往下(低地址)
找到后面变量的地址, 存取相应的变量.我目前所使用的gcc放到最后的做法, 也可以理解
成一种优化.
3. 对变长数组的元素存取, 可以把首地址放在寄存器里面, 也可以在把首地址放在堆栈
里面,然后存取元素的时候先取出首地址, 然后在通过偏移量的方式存取里面的元素.
4.变长数组不能在静态存储区中, 这个很显然, 静态存储区在编译时就确定分配内存的
大小,不像堆栈一样是动态的, 变长数组显然不能定义在静态存储区中.
5. 变长数组的意义, 我觉得在c里面还是有一些意义, 如果是在对性能,内存要求十分严
格的地方, 允许声明变长数组还是比较方便的, 因为原来需要一块连续内存的地方要么
声明的大一些,保证肯定够用, 但这样就浪费了, 在对内存要求严格的地方就不好了,
另外一种做法就是malloc动态分配, 但是这样的缺点是需要手动管理, 要手动free,
程序如果大的话内存管理不好的话容易内存泄漏,所以在c里面还是有一些意义.
但是在c++里面已经有vector了, 而且c++也不太多应用在对性能,内存要求非常高的地方,
6.使用变长数组, 最重要的当然是要检查数组的size的合法性了,
我前面举例为了减少干扰因素, 都没有做检查, 实际的程序肯定要做这个检查。
另外, 就是又多了一种堆栈溢出的方法,数组大小如果是负的话又可以跳到不该跳到
的地方了