gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 18:09:43 27 4
gpt4 key购买 nike

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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com