我只是想知道,如何通过c ++程序来管理类型信息?
例如。漂浮f;需要32位内存。但由于所有位都用于保存值,程序如何记住它是float类型?
(我知道这是一个非常无聊的问题......)
答案 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位”