Memory 计算机如何跟踪特定内存位置存储的数据类型?

Memory 计算机如何跟踪特定内存位置存储的数据类型?,memory,variables,types,Memory,Variables,Types,我想这不是严格意义上的“编程”,但我已经思考了一段时间。当您创建一个变量并为其赋值时,计算机会为该变量分配一定数量的字节并存储该值,但当它稍后返回使用时,它如何知道该内存地址中的数据类型呢?计算机不会。有些语言可能会用类型标记其数据(特别是动态语言,其中任何变量都可以保存任何数据类型);在其他语言(如C)中,声明变量,编译器知道何时使用与该变量关联的地址空间将该值视为特定类型。计算机本身并不在意,它看到的只是每字节8位。答案取决于您使用的语言是被解释的还是被编译的,以及其他各种细节。对于像C这样

我想这不是严格意义上的“编程”,但我已经思考了一段时间。当您创建一个变量并为其赋值时,计算机会为该变量分配一定数量的字节并存储该值,但当它稍后返回使用时,它如何知道该内存地址中的数据类型呢?

计算机不会。有些语言可能会用类型标记其数据(特别是动态语言,其中任何变量都可以保存任何数据类型);在其他语言(如C)中,声明变量,编译器知道何时使用与该变量关联的地址空间将该值视为特定类型。计算机本身并不在意,它看到的只是每字节8位。

答案取决于您使用的语言是被解释的还是被编译的,以及其他各种细节。对于像C这样的编译语言,答案是编译器在将代码翻译成机器代码(或汇编程序)时,有一个内部数据结构,说明每个变量是什么——它的类型是什么,存储在哪里,可能还有用于优化目的的其他信息。(但当代码实际运行时,这些信息就消失了;编译代码需要这些信息,而不是运行代码。)


对于某些解释语言,答案是解释器具有类似的数据结构,只要使用变量,就会查找该数据结构。对于其他变量,解释器以相同的方式处理所有变量,但它们的值都附加了类型信息。

通常情况下,不会。大多数动态语言都有类似于
typeof
,因此通常有一个“对象头”存储一些元数据,包括类型(和其他信息,例如refcount)。但是您仍然无法在随机内存块中识别对象的起始位置(毕竟都是1和0),因此您需要始终指向它的指针

传统的静态/编译语言(当然通常)不存储此类信息。毕竟,如果编译器知道
x
是一个
int
,那么它就知道需要加载到寄存器中的字节数以及用于添加的操作码。即使在添加虚拟函数时,也只需编译函数指针表(无需进一步的元数据-
obj->foo()
转换为“获取vtable的第n个条目并调用它”,而不是“在此地址调用代码”)