程序如何管理类型信息?

时间:2011-02-20 21:59:09

标签: c++ types

我只是想知道,如何通过c ++程序来管理类型信息?

例如。漂浮f;需要32位内存。但由于所有位都用于保存值,程序如何记住它是float类型?

(我知道这是一个非常无聊的问题......)

5 个答案:

答案 0 :(得分:12)

您需要区分静态(编译时)类型和动态(运行时)类型。

编译 时编译器 管理

静态 类型,并且嵌入的特定于类型的语义除外在生成的代码中,在运行时忘记了。

动态 类型信息通常保存在所谓的特定于类型的“虚拟表”中​​,该表保存指向该类型具有的所有虚拟函数以及少量运行的指针 - 时间类型信息C ++支持。只有多态类型(具有至少一个虚函数的类型)才会附加动态类型信息。

答案 1 :(得分:7)

通常(也就是说,除非你使用RTTI)程序不知道那种事情(虽然编译器非常严格地检查它以避免错误)。程序代码只是执行“就好”,即如果你编写了一些使用浮点变量的代码,那么它将根据从相应内存地址加载的任何值执行浮点指令。

如果您使用RTTI(运行时类型信息),则编译器会在可执行文件中存储 lot 的额外信息,这也可以让您在运行时确定类型。

最后,通过虚拟继承,某种类型的信息(虽然不能直接访问)存储在vtable中。对于每个对象类型(不是每个对象,但对于类型,即所有对象在一起),编译器会生成一个特殊的“跳转表”,使其能够正确映射重载的函数。你不知道这个,你没有看到任何东西,但它会“正常工作”。然而,这是一种隐含的类型信息。

答案 2 :(得分:4)

C ++通常不需要任何类型信息,因为它是一种静态语言 - 这意味着所有类型检查都是在编译时而不是在运行时完成的。

说你有这段代码:

float fn(float a) { return a + 1.f; }

...编译器已经知道fn应该接收一个浮点数,向它添加1.f,然后返回一个浮点数。它可以相应地生成机器代码,不需要在运行时查找任何内容。

答案 3 :(得分:3)

编译器管理类型。运行的可执行文件没有。对于可执行文件,内存中的那4个字节就是内存中的4个字节。但是编译器确保只有整数指令或浮点指令才能对它们进行操作。

答案 4 :(得分:0)

可能有用的是要注意,编译后的c ++是编译器所针对的任何cpu指令集的汇编语言。

像“浮动i = 2.0 + n”这样简单的事情。转为“预留32位,取2.0和另一组32位,并执行32位FLOATING POINT版本的ADD。然后将其指定为我们刚刚保留的32位”