关于局部变量内存分配的小问题,多谢指教
一个函数中的局部变量(比如:char buf[10])的空间是什么时候分配的?编译时还是运行时?
记得这应该是静态分配内存的方式(编译时)
如果是编译时分配的话,那在运行时又得把它压栈,进行程序对应的操作
不是又在栈中分配一次空间?不是很浪费吗?
多谢
[解决办法]
运行时。
[解决办法]
首先这个分配空间是原理上应该这么认为
好象你的概念中会有个分配啊回收的过程好象有很多开销
但是在实际运行时 内部的栈数据通过stack指针的加减来保留和回收空间
是不影响运行效率的 进去的时候把所有空间算一下ebp+多少
函数结束出去只要恢复保存入口的栈就结束了 这个是设计上能够节省的
[解决办法]
程序在编译时,确定所有代码的地址和每个过程的入口点和函数,程序执行时代码放在内存中的代码区且在内存中地址是固定的,而数据区在固定地址只存放全局和静态数据,其他数据都是在具体调用到某个过程再分配栈和堆空间的。
函数内的局部变量(包括参数)都是代码执行到该函数时创建,函数执行结束,这些变量所占内存自动释放。
[解决办法]
运行时
在编译的只是把它放在变量列表里
等到程序执行到这里的时候
才在栈上为其开辟一块空间
[解决办法]
运行时分配
[解决办法]
编译时,对于局部变量(比如char buf[10]),只不过生成了这样一条语句:
sub esp,10; //esp减去10,就在堆栈上腾出了10个字节的空间给变量buf(也可能为了对
//齐对多分配几个字节)。
函数结束回收时只要将esp的值恢复到之前的值就等于释放了这部分内存。
比如:
push ebp
mov ebp,esp //原始esp保存起来
sub esp,0xA
//....
mov esp,ebp //函数结束,恢复esp
pop ebp //恢复ebp
[解决办法]
栈空间一般不必考虑分配的问题,都是通过栈帧展开实现。
如果是嵌入式系统,可能是需要考虑的。
[解决办法]
静态分配内存的方式并不是指编译的时候分配,而是指在程序加载到内存后在主函数main()调用之前分配.