C++ POD 类型是否具有 RTTI?
Do C++ POD types have RTTI?
据我了解 RTTI 在各种 C++ 编译器(例如 GCC)中的实现方式,指向 type_info
数据的指针存储在每个 class 的 vtable
数据中。
而且如前所述 here,POD 类型可能没有 vtable
。
但是如果 POD 类型可能没有 vtable
那么指向 type_info
的指针存储在哪里?我知道它是特定于实现的,但最好了解 C++ 编译器(如 GCC)的内部结构。
有两种类型(对于RTTI而言):多态类型和非多态类型。多态类型是一种具有虚函数的类型,它本身或从基础 class 继承而来。非多态类型是 其他一切;这包括 POD 类型,但它也包括许多其他类型。
如果你有一个 pointer/reference 到一个多态类型 T
,并且你在它上面调用 typeid
,你得到的 type_info
不一定是 type_info
你会回来 typeid(T{})
。相反,它是对象的 true 动态类型:最派生的 class.
如果您有 pointer/reference 到 非 多态类型 T
,typeid
将 始终 return type_info
代表 T
本身。非多态类型总是假定 pointer/reference 正是它的静态类型。
POD 类型是非多态的,但大量其他类型也是非多态的。
据我了解 RTTI 在各种 C++ 编译器(例如 GCC)中的实现方式,指向 type_info
数据的指针存储在每个 class 的 vtable
数据中。
而且如前所述 here,POD 类型可能没有 vtable
。
但是如果 POD 类型可能没有 vtable
那么指向 type_info
的指针存储在哪里?我知道它是特定于实现的,但最好了解 C++ 编译器(如 GCC)的内部结构。
有两种类型(对于RTTI而言):多态类型和非多态类型。多态类型是一种具有虚函数的类型,它本身或从基础 class 继承而来。非多态类型是 其他一切;这包括 POD 类型,但它也包括许多其他类型。
如果你有一个 pointer/reference 到一个多态类型 T
,并且你在它上面调用 typeid
,你得到的 type_info
不一定是 type_info
你会回来 typeid(T{})
。相反,它是对象的 true 动态类型:最派生的 class.
如果您有 pointer/reference 到 非 多态类型 T
,typeid
将 始终 return type_info
代表 T
本身。非多态类型总是假定 pointer/reference 正是它的静态类型。
POD 类型是非多态的,但大量其他类型也是非多态的。