• C++:不同类型的指针的本质与差异


    转自:http://blog.csdn.net/richerg85/article/details/10076365

    指针的类型(The Type of a Pointer)

               一个指向ZooAnimal(一个类)的指针是如何与一个指向整型的指针或者指向template Array的指针有所不同?

     

    ZoolAnimal *px;
    int *pi;
    Array< String > *pta;

           以内存需求的观点来说,没有什么不同。以上三种类型都有足够的内存来放置一个机器地址(通常是一个word)。以上“指向不同类型的指针”间的差异,既不在于其指针表示方法不同,也不在于其内容(代表一个地址)不同,而是在于其所寻址出来的对象(object)类型不同。也就是说,“指针类型”会教导编译器如何解析某个特定地址中的内存内容及其大小。

            ZooAnimal类定义如下:

     

    class ZooAnimal{
       public:
            ZoolAnimal();
             virtual ~ZoolAnimal();
             //...
             virtual void rotate();

       protected:
           int loc;
           String name;
    };

    ZooAnimal za( "Zoey" );
    ZooAnimal *pza = &za;

           分析以上代码:

                                                                           

       图1:非派生类的对象布局和指针布局

     

             1、一个指向地址1000的整数指针,在32位机器上,将涵盖地址空间1000~1003(4个字节)

            2、如果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++对象模型》所整理。

  • 相关阅读:
    五、Docker网络管理
    四、Docker存储管理
    三、Docker镜像基础管理
    二、Docker容器基础管理
    模仿DotnetCore中间件的方式,做一个列表过滤的功能
    web开发常见的鉴权方式
    Go语言使用Godep进行包管理
    Go语言中的数据格式(json、xml 、msgpack、protobuf)
    epoll原理解释(转)
    内存管理之内存池概述(转)
  • 原文地址:https://www.cnblogs.com/qinfengxiaoyue/p/4168942.html
Copyright © 2020-2023  润新知