一个指向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++对象模型》所整理。