有关变长数组(VLA)(转)

在忽然听到这个名词后,在网上搜的。
 

1. 变长数组是分配在堆栈上的, 其实从语义的角度也应该是这样, 变长数组仍是一个数组, 仍是一个局部变量, 在c语言中, 
局部变量是分配在堆栈上的, malloc才是分配在堆上面的. 这里面没有不存在什么 
内存泄漏, 由于堆栈上的内存是不须要程序员管理的 
  
2. 变长数组和其余变量共同存在于一个做用域以内时, 变长数组是在最后分配的, 
也就是处在堆栈的最下面(地址最低). 这也是变长数组不一样于普通变量的状况, 
普通变量的内存分配是按照定义顺序来的, 先定义的先分配, 可是变长数组不是这样的, 
在一个做用域内变长数组都是放到最后分配的, 缘由很简单, 变长数组的大小在编译时无 
法肯定, 因此若是在变长数组后面分配普通变量的空间, 那么对后面普通变量的存取就不 
方便了,固然简单的状况能够经过优化解决, 可是若是有不少的变量数组和普通变量混合 
在一块儿的话,优化很难作到很好, 因此把变长数组都放在最后面分配, 是一个比较合理的 
办法; 
固然, 不是说必定要放在最后, 按照普通的定义顺序来分配空间也是能够的,只是在存取 
可变数组后面的变量的时候, 须要首先找到可变数组的起始地址, 而后再往下(低地址) 
找到后面变量的地址, 存取相应的变量.我目前所使用的gcc放到最后的作法, 也能够理解 
成一种优化. 
  
  
3. 对变长数组的元素存取, 能够把首地址放在寄存器里面, 也能够在把首地址放在堆栈 
里面,而后存取元素的时候先取出首地址, 而后在经过偏移量的方式存取里面的元素. 
  
4.变长数组不能在静态存储区中, 这个很显然, 静态存储区在编译时就肯定分配内存的 
大小,不像堆栈同样是动态的, 变长数组显然不能定义在静态存储区中. 
  

5. 变长数组的意义, 我以为在c里面仍是有一些意义, 若是是在对性能,内存要求十分严 
格的地方, 容许声明变长数组仍是比较方便的, 由于原来须要一块连续内存的地方要么 
声明的大一些,保证确定够用, 但这样就浪费了, 在对内存要求严格的地方就很差了, 
另一种作法就是malloc动态分配, 可是这样的缺点是须要手动管理, 要手动free, 
程序若是大的话内存管理很差的话容易内存泄漏,因此在c里面仍是有一些意义. 
可是在c++里面已经有vector了, 并且c++也不太多应用在对性能,内存要求很是高的地方, 
  
6.使用变长数组, 最重要的固然是要检查数组的size的合法性了, 
我前面举例为了减小干扰因素, 都没有作检查, 实际的程序确定要作这个检查。
另外, 就是又多了一种堆栈溢出的方法,数组大小若是是负的话又能够跳到不应跳到 
的地方了 
html

相关文章
相关标签/搜索