首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >程序如何知道变量的类型?

程序如何知道变量的类型?
EN

Stack Overflow用户
提问于 2016-01-04 15:12:11
回答 2查看 88关注 0票数 2

这个问题以前可能已经回答过了,但我已经搜索过这些论坛和谷歌,但我认为我没有用最简洁的方式问正确的问题,所以我道歉,但我会尝试进一步解释我的问题:

例如,您有一个变量,让我们将其命名为x,它指的是存储二进制值01000001的内存块。我想知道:这个二进制表示的类型信息在哪里保存?

是否有像字典那样的内存映射系统,将二进制表示映射到某些预定义的类型列表,例如,0000表示int0001表示char

我觉得情况并非如此,因为这会带来巨大的开销,并且会随着例如引入更多用户定义的类型或创建更多的变量而增加。但我想这可能是weakly-typed语言的情况。(也许不是)但是strongly-typed语言呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-01-04 15:32:45

我想知道:这个二进制表示的类型信息在哪里保存?

没必要储存它。静态类型化程序编译成针对某些内存位置的一系列指令。静态打印验证指令是否操作在保存适当数据的内存位置上。但是,在运行时,无需任何验证就可以执行这些指令。

考虑一下这个简单的C函数:

代码语言:javascript
复制
void increment(int* x) {
    (*x) += 1;
}

编译时,编译器将验证指针后面的值是否包含类型为int的值。然而,指针本身只是一个数字,因此,无论何时,增量操作都可以并且将被执行。

因此,这个程序是很好的类型,但你失去了上述保证.

代码语言:javascript
复制
void increment(void* x) {
    (*(int*)(x)) += 1;
}

这里的关键观察是,低级指令以相同的方式对各种数据进行操作。

票数 5
EN

Stack Overflow用户

发布于 2016-01-04 17:10:06

静态确定的类型在运行时不知道:它们仅在编译期间才需要,例如,用于解析重载并检查类型是否与要运行的操作相匹配,因此编译器在优化时将它们清除掉。

有些语言支持动态确定的类型,如C++ (仅适用于具有虚拟方法的类)/java/C#,但也支持python和javascript。在运行时使用那些对象类型的信息(即对象的“真实”类型,而不是保持其多态性的变量的类型)来解析在运行时调用哪种方法。此信息通常存储为指向定义类型的结构的指针。拥有多种类型的运行时开销对于每个类来说都是一个恒定数量的内存。这通常并不重要,但也有一些例外(例如,在Javascript中,当您编写闭包时,您正在为您构建的每个对象创建一个新类型,在某些浏览器中这是相当昂贵的)。相反,您在编译过程中可能会有很大的开销:例如,在C++模板中经常会发生这种情况。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34594161

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档