gpt4 book ai didi

c++ - 运行时程序的机器指令存储在哪里?

转载 作者:太空狗 更新时间:2023-10-29 19:37:24 24 4
gpt4 key购买 nike

据我所知,每当我们运行任何程序时,程序的机器指令都会加载到 RAM 中。同样,有两个内存区域:堆栈和堆。

我的问题是:机器指令存储在内存的哪个区域?栈还是堆?

我了解到,尽管函数内部没有声明变量,但以下程序会出现运行时错误。这背后的原因是堆栈溢出。那我应该假设函数的机器指令存储在堆栈中吗?

int func()
{
return func();
}

最佳答案

都不是,因为它不是像堆栈和堆那样动态分配的。

可执行文件加载器将可执行文件 (.text) 及其包含的任何静态数据(如全局变量 (.data/.rodata) 的初始值)加载到未使用的 RAM 区域中。然后它设置可执行文件要求的任何零初始化内存 (.bss)。

只有 then 是为 main() 设置的堆栈。如果您输入另一个函数,堆栈内存将在堆栈上分配,保存返回地址、函数参数和任何本地声明的变量以及通过 alloca() 分配的任何内存。[1]当您从函数返回时释放内存。

堆内存由 malloc()calloc()realloc() 分配。当您 free()realloc() 时,它会被释放。

用于可执行文件及其静态数据的 RAM 在进程终止之前不会被释放。

因此,栈和堆基本上都在应用程序的控制之下。可执行文件本身的内存在可执行加载程序/操作系统的控制之下。在配备适当的操作系统中,您甚至没有对该内存的写入权限。


关于您编辑的问题,没有。 (糟糕的风格,编辑一个问题以赋予它一个全新的角度。)

可执行代码保留在加载的位置。 调用函数不会将机器指令放入堆栈。 func()(一个不带参数的函数)唯一放在堆栈上的是返回地址,这是一个指示当前函数返回后应该继续执行的指针.

由于所有调用都不会返回,您的程序会不断在堆栈上添加返回地址,直到无法容纳为止。这与机器代码指令完全无关。


[1]:请注意,这些实际上都不是 C 语言标准的重要组成部分,而是实现定义的,并且可能有所不同——我提供了事务的简化版本。例如,函数参数可能在 CPU 寄存器中传递,而不是在堆栈中传递。

关于c++ - 运行时程序的机器指令存储在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28217803/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com