• 获取C++类成员变量的地址偏移


    今天有在校学生问怎么获取类中的成员变量的地址偏移量,这个应该是很多初学C++的人很好奇的问题。以前我在学校的时候,也有过这种需求。忘了当时是要写什么“奇怪的程序”了,反正需要获取一个类的成员变量的地址偏移量。

    其实这个问题很简单,如果你了解C++的类对象内存分布的话,这个根本不是问题。我给他举了个例子:

    struct A

    {

      int i;

    };

    &((A*)0)->i; // 这样就可以获取到偏移量了。他表示不理解,OK,我们来具体说说。

    假如定义个变量A a; 我们都知道 &a表示变量a的首地址,&(a.i)表示变量i的地址,那么&(a.i)减去&a不就得到i的偏移量了吗?

    是的,就是这么简单。那么这个例子&((A*)0)->i;有什么关系呢? 

    &((A*)0)的地地址就是0,所以&((A*)0)->i 等于&((A*)0)->i减去0。

    那个学生更好奇了,为什么&((A*)0)->i 不会出问题?这个例子里并没有为A的对象分配内存,那怎么可以得到它的地址呢?

    是的,这里确实没有分配内存,但是这个例子里我们并没有要求有内存,我们也不对内存进行操作,所以不会引来崩溃。

    &((A*)0)->i只是借助编译器为我们计算出它的地址。当编译器要用要一个成员变量的时候,它会根据对象的首地址加上成员的偏移量得到成员变量的地址。当对象的首地址为0时,得到的成员变量地址就是它的偏移量。

    到这里,明白了吧!

  • 相关阅读:
    接口测试-postman
    select
    SQLserver的七种约束。
    数据库的创建、表的创建。
    vim编辑器删除键失效
    客户端通过 HTTP 请求的 Header 信息总结
    清理/boot目录内容
    CentOS 7 配置samba 和 autofs
    CentOS 7 配置 nfs 和 autofs
    tftp简单文件传输协议基本配置
  • 原文地址:https://www.cnblogs.com/openlib/p/5352625.html
Copyright © 2020-2023  润新知