[英]C/C++ Memory Management for Functions [closed]
假设有一个具有全局功能的cpp文件。
据我所知,指令集是在我运行程序时复制到内存中的,并保留在那里直到程序结束。 每次我调用一个函数时,变量的虚拟地址都是一样的,但是我不明白它首先分配内存,并且直到程序结束或每次调用函数时才分配内存才释放。
编辑:我在除main之外的其他函数中调用函数,地址已更改。 所以问题是错误的。 抱歉。
在C和C ++的典型实现中,局部函数的存储在进入函数时分配在栈上 (请参阅: 基于栈的内存分配 ),并在函数返回时从栈中清除。
您已经看到函数在不同的调用上为其变量使用相同的地址实际上是一种巧合。 尝试将函数调用嵌套在其他调用中,看看会发生什么:
#include <stdio.h>
int funcTwo()
{
int nn = 5;
printf("funcTwo, &nn = %p\n", &nn);
}
int funcOne(int n)
{
int nn = n;
printf("funcOne, &nn = %p\n", &nn);
funcTwo();
}
int main(int argc, char **argv)
{
funcOne(5);
funcTwo();
return 0;
}
样本输出:
funcOne, &nn = 0x7fff96726b7c
funcTwo, &nn = 0x7fff96726b4c
funcTwo, &nn = 0x7fff96726b7c
请注意&nn
在对funcTwo
的两次调用中, &nn
略有不同。 这是因为从funcOne
内部调用了一个实例,该实例在堆栈上具有其自己的局部变量(以及其参数,返回地址和用于保存处理器寄存器值的任何其他空间)。 额外的堆栈用法将funcTwo
的变量地址推到堆栈的funcTwo
(到较低的地址,因为在此体系结构上堆栈向下增长)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.