c++ - typeid 是如何工作的,对象又是如何存储类信息的?

标签 c++ typeid

http://en.wikipedia.org/wiki/Typeid

这对我来说似乎是个谜:编译器如何存储有关对象类型的信息?基本上,一个空类一旦实例化,内存中的大小就不会为零。

最佳答案

它的存储方式是实现定义的。有许多完全不同的方法可以做到这一点。

但是,对于非多态类型,没有需要存储。对于非多态类型,typeid 返回有关表达式的static 类型的信息,即它的编译时 类型。该类型在编译时始终已知,因此无需将任何其他信息与特定对象相关联(就像要使 sizeof 正常工作一样,您实际上不需要在任何地方存储对象大小)。您在问题中提到的“一个空对象”将是一个非多态类型的对象,因此无需在其中存储任何内容,并且它的大小为零也没有问题。 (同时,多态对象永远不会真正“空”,也永远不会“内存中的大小为零”。)

对于多态类型,typeid 确实会返回有关表达式的动态 类型的信息,即有关其运行时 类型的信息。要实现这一点,必须在运行时将某些内容存储在实际对象中。正如我上面所说,不同的编译器实现不同。例如,在 MSVC++ 中,存储在每个多态对象中的 VMT 指针指向一个数据结构,该结构除了包含实际的 VMT 之外,还包含所谓的 RTTI - 关于对象的运行时类型信息。

您在问题中提到零大小对象的事实可能表明您对 typeid 可以做什么和不能做什么有一些误解。再次记住,typeid 能够确定对象的实际(即动态)类型仅多态类型。对于非多态类型,typeid 无法确定对象的实际类型并恢复为原始编译时功能。

关于c++ - typeid 是如何工作的,对象又是如何存储类信息的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4617446/

相关文章:

c++ - 如何在计算中处理 "unsigned long long int"?

c++ - 为许多类型创建 "custom typeid"并缓存它们的 sizeof()

c++ - 为什么在使用 "typeid"时必须输入数组长度?

c++ - 为什么使用存储在虚方法表中的地址调用虚函数会返回垃圾?

c++ - typeid指针和引用比较区别?

c++ - Typeid 无法正常运行

c++ - typeid 是否安全地用于由同一编译器编译的另一个进程提供的指针?

c++ - Cocos2dx 3.x 按钮 Sprite [C++]

c++ - cin 还是 printf?

c++ - <% %> 在 C++ 中做什么?