c运行时使用什么数据结构来存储有关变量的信息,如类型、大小等
前任:
void foo(){
int bar=0, goo=44;
int*q, *p = &goo;
//some code follows
bar = goo + bar*9;
...
q=p;
...
}
在上面的代码中,我们有局部变量 bar 和 goo,当控制到达 foo 函数时,它们将被分配到堆栈上。但是,运行时将如何在稍后引用这些变量时确定这些变量是某某类型和某某大小?
运行时不保留任何此类信息 - 它被编译成编译器生成为常量的二进制代码。编译器知道每种类型的大小,因此它知道如何生成适当的机器代码来清理堆栈、访问数组元素、访问结构的字段等等。无需在运行时保留此信息,因为二进制代码已经包含所有适当的指令。
可变大小在编译时是已知的,因此无需在运行时保留它们。
int bar = 0;
简单地转化为
"shift the stack pointer by 4 bytes"
在运行时根本不需要知道变量类型。您可能会收到有关不兼容类型的编译器警告,例如使用 打印int
,%c
但这更像是对您的健全性检查。变量只是命名一块数据,如何解释它们取决于您 - 作为整数,作为指针,作为 4 个字符......
通常,此类数据在编译时被硬编码在底层机器代码中,并且在运行时不保存此类数据。
例如,假设变量 bar 放置在堆栈上。编译器会记住它在堆栈上的位置,并且所有对 bar 的后续引用都将成为机器代码,该代码在相关堆栈偏移处获取变量的大小。对于保存在处理器寄存器中的变量也是如此,对它们的引用将转换为访问适当寄存器和字节长度的机器代码。
编译器知道其配置平台的此信息。编译器还有 C 头文件来告诉它各种数据类型的大小。看到这个