成员函数调用和C++对象模型
Member Function Call and the C++ Object Model
请考虑以下代码,该代码旨在研究如何进行成员函数调用以及它与C++的对象模型的关系:
struct A {
int a_;
};
struct B : A {
int b_;
void f();
};
void B::f() {
std::cout << "thist" << std::hex << this << 'n';
}
struct C: B {
int c_;
};
int main()
{
C c;
C* pc = &c;
std::cout << "&ct" << 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_)
表示子对象B
在c
中的偏移量。
因此,基于上述观察结果,输出应为:
&c address_of_c
this address_of_c + sizeof(a_) = address_of_c + 4
但是我得到的是两者的相同地址(我使用的是g ++ 9.2(:
&c 0xffffcc0c
this 0xffffcc0c
我不清楚为什么?有人可以解释一下吗?
仅供参考:Bjarne Stroustrup有一篇关于这个的文章;更具体地说,你可以参考第4.2节(第373页(:
https://www.usenix.org/legacy/publications/compsystems/1989/fall_stroustrup.pdf
谢谢!
类C 只继承一个类 B。所以你有
struct B
^
|
|
struct C
创建类 C 的对象时,类 B 的子对象被放置在为类 C 的对象分配的内存的开头。
在类 B 的对象中,有一个类 A 的子对象。
您可以按以下方式想象 C 类对象的放置
struct B b;
int c_;
相关文章:
- 成员函数调用和C++对象模型
- 微调张量流对象检测预训练模型
- JSON对象到C++模型
- 组件对象模型 (COM):IMalloc::Alloc 在哪里分配内存?
- 如何使用 word 对象模型中的C++接口在 word 中添加自定义 XML 艺术
- 如何在Windows中注册COM(组件对象模型)?(用于图标覆盖处理程序)
- 如何在 Visual C++ 2008 中使用组件对象模型
- 我应该如何编写用C++代码编写的Lua API/对象模型的文档
- 作为不同用户运行的两个exe如何使用COM(组件对象模型)进行通信
- 组件对象模型查询接口
- 我不明白<C++对象模型内部"中'Argument Initialization'的内容>
- 俄罗斯方块对象模型在C++
- G++ 对象模型
- 如何创建用于 QML 的通用对象模型
- C++对象模型转换
- 类似于 GLIB 的对象模型?
- 从非托管C++调用C#方法,该方法传递回一个完整的对象模型
- 对象模型加载纹理坐标和顶点位置没有正确加载
- c++对象模型的缺点.解决方案是什么?
- 在c++中将Outlook对象模型MailItemPtr转换为MAPI IMessage