这个问题以前可能已经回答过了,但我已经搜索过这些论坛和谷歌,但我认为我没有用最简洁的方式问正确的问题,所以我道歉,但我会尝试进一步解释我的问题:
例如,您有一个变量,让我们将其命名为x,它指的是存储二进制值01000001的内存块。我想知道:这个二进制表示的类型信息在哪里保存?
是否有像字典那样的内存映射系统,将二进制表示映射到某些预定义的类型列表,例如,0000表示int,0001表示char?
我觉得情况并非如此,因为这会带来巨大的开销,并且会随着例如引入更多用户定义的类型或创建更多的变量而增加。但我想这可能是weakly-typed语言的情况。(也许不是)但是strongly-typed语言呢?
发布于 2016-01-04 15:32:45
我想知道:这个二进制表示的类型信息在哪里保存?
没必要储存它。静态类型化程序编译成针对某些内存位置的一系列指令。静态打印验证指令是否操作在保存适当数据的内存位置上。但是,在运行时,无需任何验证就可以执行这些指令。
考虑一下这个简单的C函数:
void increment(int* x) {
(*x) += 1;
}编译时,编译器将验证指针后面的值是否包含类型为int的值。然而,指针本身只是一个数字,因此,无论何时,增量操作都可以并且将被执行。
因此,这个程序是很好的类型,但你失去了上述保证.
void increment(void* x) {
(*(int*)(x)) += 1;
}这里的关键观察是,低级指令以相同的方式对各种数据进行操作。
发布于 2016-01-04 17:10:06
静态确定的类型在运行时不知道:它们仅在编译期间才需要,例如,用于解析重载并检查类型是否与要运行的操作相匹配,因此编译器在优化时将它们清除掉。
有些语言支持动态确定的类型,如C++ (仅适用于具有虚拟方法的类)/java/C#,但也支持python和javascript。在运行时使用那些对象类型的信息(即对象的“真实”类型,而不是保持其多态性的变量的类型)来解析在运行时调用哪种方法。此信息通常存储为指向定义类型的结构的指针。拥有多种类型的运行时开销对于每个类来说都是一个恒定数量的内存。这通常并不重要,但也有一些例外(例如,在Javascript中,当您编写闭包时,您正在为您构建的每个对象创建一个新类型,在某些浏览器中这是相当昂贵的)。相反,您在编译过程中可能会有很大的开销:例如,在C++模板中经常会发生这种情况。
https://stackoverflow.com/questions/34594161
复制相似问题