编译器如何以及在内存中的何处存储有关变量类型的信息?

Posted

技术标签:

【中文标题】编译器如何以及在内存中的何处存储有关变量类型的信息?【英文标题】:How and where in memory does the compiler store the information about what type a variable is? 【发布时间】:2013-11-29 06:20:31 【问题描述】:

显然,编译器必须存储变量 x 是无符号整数还是有符号整数、浮点数或其他信息,但存储在何处以及如何存储?

是否有某种查找表?我在内存中的哪个位置找到它,在可执行文件的哪个部分?

【问题讨论】:

称为符号表。 ***.com/questions/69112/what-is-a-symbol-table 是的,输出对象文件(.o、.obj)中包含一个符号表,其中存储了每个变量的类型和名称以及返回类型、调用约定、参数等...对于翻译单元(通常是 .c 或 .cpp 文件)中的每个函数。但是,此信息可能会在链接和生成可执行文件之后丢失,在这些情况下,您需要一个调试符号表。但是你不会在内存中找到这个,通常调试符号存储在一个单独的文件中并由调试器单独使用;您的程序运行不需要它们。 你只是好奇编译过程是如何工作的,还是这个问题下面有更大的问题?如果你神奇地拥有这些信息,你会在你的程序中使用它吗?怎么样? 【参考方案1】:

这是隐含的,在编译器选择的指令中。

例如,如果地址 18 包含 float,编译器可能会使用指令从地址 18 加载浮点寄存器。如果地址 20 的邻居包含 int,编译器可能会加载前一个地址的整数寄存器 + 2。

如前所述,编译器有一个符号表,因此它知道所有变量的位置。这允许它选择正确的指令。但是您不能简单地从各个指令中推导出该符号表的内容。

【讨论】:

【参考方案2】:

C 和 C++ 实现通常不在任何地方存储变量名,除非您启用调试信息。正常执行不需要变量名,但从共享对象或 DLL 导出的符号除外。

【讨论】:

但是如果你做算术运算,那么CPU必须知道它是unsigned int还是signed int。 @defoe:加法或乘法等一些算术指令在有符号/无符号类型的位级别是相同的。对于那些签名很重要的人,有单独的说明。 @defoe CPU 不需要“知道”这一点,因为编译器已经针对每种情况发出了正确的指令。 CPU 不做任何类型分析。

以上是关于编译器如何以及在内存中的何处存储有关变量类型的信息?的主要内容,如果未能解决你的问题,请参考以下文章

VC++ -变量类型

Java原始类型变量存储

《深入理解JAVA虚拟机》——学习笔记

变量的基本概念

java 静态变量和静态常量

深入理解java虚拟机---java虚拟机内存管理