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/