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