一個指向ZooAnimal(一個類)的指針是如何與一個指向整型的指針或者指向template Array的指針有所不一樣?c++
ZoolAnimal *px;
int *pi;
Array< String > *pta;佈局
之內存需求的觀點來講,沒有什麼不一樣。以上三種類型都有足夠的內存來放置一個機器地址(一般是一個word)。以上「指向不一樣類型的指針」間的差別,既不在於其指針表示方法不一樣,也不在於其內容(表明一個地址)不一樣,而是在於其所尋址出來的對象(object)類型不一樣。也就是說,「指針類型」會教導編譯器如何解析某個特定地址中的內存內容及其大小。學習
ZooAnimal類定義以下:.net
class ZooAnimal{
public:
ZoolAnimal();
virtual ~ZoolAnimal();
//...
virtual void rotate();指針
protected:
int loc;
String name;
};對象
ZooAnimal za( "Zoey" );
ZooAnimal *pza = &za;blog
分析以上代碼:
內存
圖1:非派生類的對象佈局和指針佈局字符串
一、一個指向地址1000的整數指針,在32位機器上,將涵蓋地址空間1000~1003(4個字節)get
二、若是String是傳統的8-bytes(包含一個4-bytes的字符指針和一個用來表示字符串長度的整數),那麼一個ZooAnimal指針將橫跨地址空間1000~1015(4+8+4)(?這個地方不是太明白,如上圖,int loc佔4個bytes,String 佔8個bytes,那4個bytes是vptr虛表佔的仍是地址1000佔的?本身認爲是vptr虛表佔的。)
那麼一個指向地址1000而類型爲void*的指針,將涵蓋怎樣的地址空間?這個咱們是不知道的!這就是爲何一個類型爲void*的指針只可以含有一個地址,而不可以經過它操做所指對象的緣故。
因此,轉型(cast)或者類型轉換,實際上是一種編譯器指令,大部分狀況下它並不改變一個指針所含的真正地址,它隻影響「被指出內存的大小和其內容「的解釋方式。(下一篇文章看完會懂這句話的意思的)
學習《深刻探索c++對象模型》所整理。