考虑以下代码,该代码旨在研究如何进行成员函数调用,以及它与C++的对象模型的关系:
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将具有以下对象布局:
-------
| a_ |
|------ |
| b_ |
|------ |
| c_ |
-------和,
B::f()将被转换为void f(B *const)pc->f(),将被转换为void f(pc + offset(b_)),其中offset(b_)表示c.中子对象B的偏移量。
因此,根据上述观察,产出应如下:
&c address_of_c
this address_of_c + sizeof(a_) = address_of_c + 4但是我得到的地址是相同的(我使用的是g++ 9.2):
&c 0xffffcc0c
this 0xffffcc0c我不知道为什么?谁能解释一下吗?
FYI: Bjarne Stroustrup有一篇关于这方面的文章;更具体地说,您可以参考第4.2节(第373页):
https://www.usenix.org/legacy/publications/compsystems/1989/fall_stroustrup.pdf
谢谢!
发布于 2020-02-16 21:10:20
C类只继承一个B类,所以
struct B
^
|
|
struct C当创建C类的一个对象时,B类的子对象被放在分配给C类对象的内存的开头。
在B类的对象中,有一个A类的子对象。
您可以想象C类的对象的放置方式如下
struct B b;
int c_;https://stackoverflow.com/questions/60253018
复制相似问题