首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >成员函数调用与C++对象模型

成员函数调用与C++对象模型
EN

Stack Overflow用户
提问于 2020-02-16 20:43:44
回答 1查看 51关注 0票数 1

考虑以下代码,该代码旨在研究如何进行成员函数调用,以及它与C++的对象模型的关系:

代码语言:javascript
复制
struct A {
  int a_;
};
struct B : A {
  int b_;
  void f();
};
void B::f() {
  std::cout << "this\t" << std::hex << this << '\n';
}
struct C: B {
  int c_;
};
int main()
{
  C c;
  C* pc = &c;
  std::cout << "&c\t" << std::hex << pc << '\n';
  pc->f();
  return 0;
}

基于C++对象模型,对象c将具有以下对象布局:

代码语言:javascript
复制
  -------
 | a_    |
 |------ |
 | b_    |
 |------ |
 | c_    |
  -------

和,

  1. B::f()将被转换为void f(B *const)
  2. pc->f(),将被转换为void f(pc + offset(b_)),其中offset(b_)表示c.

中子对象B的偏移量。

因此,根据上述观察,产出应如下:

代码语言:javascript
复制
&c     address_of_c
this   address_of_c + sizeof(a_) = address_of_c + 4

但是我得到的地址是相同的(我使用的是g++ 9.2):

代码语言:javascript
复制
&c      0xffffcc0c
this    0xffffcc0c

我不知道为什么?谁能解释一下吗?

FYI: Bjarne Stroustrup有一篇关于这方面的文章;更具体地说,您可以参考第4.2节(第373页):

https://www.usenix.org/legacy/publications/compsystems/1989/fall_stroustrup.pdf

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-16 21:10:20

C类只继承一个B类,所以

代码语言:javascript
复制
struct B
   ^
   |
   |
struct C

当创建C类的一个对象时,B类的子对象被放在分配给C类对象的内存的开头。

在B类的对象中,有一个A类的子对象。

您可以想象C类的对象的放置方式如下

代码语言:javascript
复制
struct B b;
int c_;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60253018

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档