@会网络的老鼠

涂飞平的博客空间

关于栈内存分配的补充 [原]

12 年前 0

StackAlloc与StackFree函数必须是成对使用的,而且一定要在一个函数的内部完成对其的调用。
因为使用它可以快速分配数量不大的内存,因为如果是在堆中分配同样的内存,就必须向操作系统申请,然后通过2eh中断到系统空间,然后再分配出一块物理内存给你,很耗资源(这里主要指的是时间),但对于申请后可能长时间存在的内存块,这样的申请方式还是比较好的,因为栈中分配也有它的弱点,就是栈的空间一般都不大(默认情况下是1M).
现在说说为什么StackAlloc与StackFree函数要在一个函数中完成调用呢?
一个函数进入点代码一般都是这样的:
push ebp
mov ebp,esp //建立堆栈祯
...

而函数退出的时候一般的代码是这样的:
mov esp,ebp
pop ebp
ret //释放堆栈祯
这里堆栈祯的作用是为了在函数中尽量不对esp直接操作,而只是操作它的副本ebp,并且使用ebp可以更好的(更容易理解的,函数内部对于栈的操作一般通过ebp寄存器)分配局部变量空间(局部变量一般都是在栈中分配空间的)。//注:所讲这些都是一种规范,但不是必须的。
看了上面的代码我们应该知道,在这里函数进入的时候它的ebp记录好原始的esp地址,在退出的时候恢复到esp寄存器中,那么我使用那两个函数的时候必须要在释放堆栈祯之前释放,否则的话,函数会在退出的时候会自动释放掉栈空间。照这么说,那还要释放函数吗?当然要,因为有这么一句话:永远不要假设任何东西!刚才所说的都是一种规范,如果按照规范来做,当然没有问题,但如果编译器在某个时候没有按照规范来做呢?(事实上很多时候编译器在优化代码的时候,的确会采用更快的方式而非通用的方式,如果你的过程只有1-2句代码,那么编译器很可能就不会加入那些堆栈祯的分配很释放操作了)所以我们一定要记得自己手工释放栈中的内存,这样我们的程序才能健壮的运行下去!!

编写评论