gpt4 book ai didi

c - 指针如何在 C 中工作 "under the hood"?

转载 作者:太空狗 更新时间:2023-10-29 16:59:57 25 4
gpt4 key购买 nike

像这样一个简单的程序:

int main(void)
{
char p;
char *q;

q = &p;

return 0;
}

&p是如何确定的?编译器是预先计算所有此类引用还是在运行时完成?如果在运行时,是否有一些变量表或查找这些东西的地方?操作系统是否跟踪它们并且只询问操作系统?

我的问题在正确解释的上下文中甚至可能没有意义,所以请直截了当。

最佳答案

How is &p determined? Does the compiler calculate all such references before-hand or is it done at runtime?

这是编译器的一个实现细节。不同的编译器可以选择不同的技术,这取决于它们为其生成代码的操作系统类型以及编译器编写者的突发奇想。

让我来为您描述一下这通常是如何在 Windows 等现代操作系统上完成的。

当进程启动时,操作系统会为进程提供一个虚拟地址空间,假设为 2GB。在这 2GB 中,有 1MB 的部分留作主线程的“堆栈”。堆栈是一个内存区域,当前堆栈指针“下方”的所有内容都在“使用中”,而它“上方”的 1MB 部分中的所有内容都是“空闲的”。操作系统如何选择堆栈的 1MB 虚拟地址空间 block 是 Windows 的一个实现细节。

(旁白:空闲空间是在堆栈的“顶部”还是“底部”,“有效”空间是“向上”增长还是“向下”增长也是一个实现细节。不同芯片上的不同操作系统以不同的方式进行。假设堆栈从高地址增长到低地址。)

操作系统确保当 main 被调用时,寄存器 ESP 包含堆栈的有效部分和空闲部分之间的分界线的地址。

(另外:同样,ESP 是第一个有效 点的地址还是第一个空闲 点的地址是一个实现细节。 )

编译器为 main 生成代码,将堆栈指针插入 比方说五个字节,如果堆栈“向下”增长,则从中减去。它减少了五个,因为 p 需要一个字节,q 需要四个字节。所以堆栈指针改变了;现在多了五个“有效”字节,少了五个“空闲”字节。

假设 qESPESP+3 中的内存,而 p 是内存现在在 ESP+4 中。要将 p 的地址分配给 q,编译器会生成复制四字节 value ESP+4 的代码通过 ESP+3 进入 locations ESP

(旁白:请注意,编译器很可能对堆栈进行布局,以便所有具有其地址的内容都位于可被四整除的 ESP+offset 值上。一些芯片具有要求地址可以被指针大小整除。同样,这是一个实现细节。)

如果您不理解用作值的地址与用作存储位置的地址之间的区别,请弄清楚。如果不了解关键区别,您将无法在 C 中取得成功。

这是它可以工作的一种方式,但正如我所说,不同的编译器可以选择他们认为合适的不同方式。

关于c - 指针如何在 C 中工作 "under the hood"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22412004/

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