手机版
你好,游客 登录 注册
背景:
阅读新闻

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

[日期:2016-04-05] 来源:Linux社区  作者:openlib [字体: ]

今天有在校学生问怎么获取类中的成员变量的地址偏移量,这个应该是很多初学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时,得到的成员变量地址就是它的偏移量。

到这里,明白了吧!

本文永久更新链接地址http://www.linuxidc.com/Linux/2016-04/129845.htm

linux
相关资讯       C++类  C++类成员变量 
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款