C++類型問題,typeid與sizeof運算符的差異?
對於一下代碼:
為啥 typeid(*pb).name()輸出的類型是 D, 既然類型是D, 為啥sizeof(*pb)輸出是8而不是12
class B
{
int b;
public:
virtual ~B(){ cout &<&< "B::~B()" &<&< endl; } }; class D : public B { int i; public: virtual ~D() { cout &<&< "D::~D()" &<&< endl; } }; D obj; B *pb = obj; cout &<&< typeid(*pb).name() &<&< endl; cout &<&< sizeof(*pb);
typeid operator 在這裡是運行時求值的,關心的是實際類型
sizeof operator 在這裡是編譯時求值的,只關心靜態聲明的類型typeid運算符有編譯時和運行時的部分,只是題主正好使用的場景如上面所說。它在題主的例子里走的是這塊:a) If expression is a glvalue expression that identifies an object of a polymorphic type (that is, a class that declares or inherits at least one virtual function), the typeid expression evaluates the expression and then refers to the std::type_info object that represents the dynamic type of the expression. If the glvalue expression is obtained by applying the unary * operator to a pointer and the pointer is a null pointer value, an exception of type std::bad_typeid or a type derived from std::bad_typeid is thrown.
type_info從哪兒來?在常見實現里它會被掛在vtable上。請看這個傳送門:為什麼bs虛函數表的地址(int*)(bs)與虛函數地址(int*)*(int*)(bs) 不是同一個? - RednaxelaFX 的回答
C++的sizeof運算符跟C的不完全一樣。前者的只有編譯時求值的語義,後者的則可以有運行時的語義(當sizeof的參數是一個Variable-Length Array時)。
C++14也有提案添加VLA支持(N3639, Runtime-Sized Arrays),但是特別不支持C99的sizeof對VLA的運行時求值。傳送門:C++ Dynamic Arrays,New adopted paper: N3639, Runtime-Sized Arrays with Automatic Storage Duration (Rev5)為啥是8不是12呀?倆int=8,一個vptr=4..
大約是這樣吧。。因為Cpp為了實現多態還要有一個虛表的指針呀。。
typeid是run time type identify,是運行時判定,sizeof是編譯期判定。
推薦閱讀:
※用 Visual Studio 2013 能學好 C++ 嗎?
※使用Visual studio 2015 找不見C++?
※C++11(VC++) 中支持多種for循環寫法,哪種比較好?
TAG:C |