gpt4 book ai didi

c++ - 运行时堆栈是否保存在内存的数据段中?

转载 作者:搜寻专家 更新时间:2023-10-31 01:23:44 25 4
gpt4 key购买 nike

在我试验了后台发生的事情后,我对堆栈内存组织非常好奇,显然看到它与我从书本上获得的微小知识相匹配。只是想检查一下我的理解是否正确。

我有一个基本程序——有 2 个函数,第一个是 foo,另一个是 main(入口点)。

void foo(){
// do something here or dont
}

int main(){

int i = 0;

printf("%p %p %p\n",foo, &i, main);

system("PAUSE");
return EXIT_SUCCESS;
};

程序的输出如下所示,main的局部变量i完全位于一个不相关的位置。 integer 是一个值类型,但用 main 的局部 char * 指针再次检查它并获得类似的结果。

00401390 0022FF44 00401396
Press any key to continue . . .

我主要理解为代码和变量分配到不同的内存段(代码段/数据段)。所以基本上说调用堆栈折叠有关函数执行的基本信息(它们的局部变量、参数、返回点)并将它们保存在数据段中是正确的吗?

最佳答案

开始时有一点警告:所有这些答案都在一定程度上受到操作系统和硬件架构的影响。 Windows 做事的方式与类 UNIX 语言、实时操作系统和旧的小型系统 UNIX 截然不同。

但正如@Richie 和@Paul 所说,基本答案是"is"。当您的编译器和链接器处理代码时,它被分解为 UNIX 中所谓的“文本”和“数据”段。 文本段包含指令和一些静态数据;数据段包含数据。

然后为堆栈和堆空间分配一大块数据段。其他 block 可以分配给静态或外部数据结构。

所以是的,当程序运行时,程序计数器正忙于从与数据不同的段中获取指令。现在我们进入一些体系结构依赖性,但一般来说,如果您有分段内存,您的指令的构造方式会尽可能高效地从段中获取一个字节,在旧的 360 体系结构中,它们有 基址寄存器,在 x86 中,随着地址空间从旧的 8080 到现代处理器,头发变长了,但是所有的指令都经过了非常仔细的优化,因为正如您可以想象的那样,获取指令及其操作数非常大量使用。

现在我们开始使用具有虚拟内存和内存管理单元的更现代的架构。现在机器有了特定的硬件,让程序把地址空间当作一个大的平坦地址范围;各个段只是简单地放置在该位虚拟地址空间中。 MMU 的工作是获取一个虚拟地址并将其转换为物理地址,包括如果该虚拟地址此时恰好不在物理内存中该怎么办。同样,MMU 硬件经过了大量优化,但这并不意味着没有相关的性能成本。但随着处理器速度越来越快,程序越来越大,它变得越来越不重要。

关于c++ - 运行时堆栈是否保存在内存的数据段中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/802656/

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