深度探索C++对象模型读书笔记(2)
以下测试平台均为vs 2012
指向Data Member的指针测试(1)
#include <stdio.h> class Base1
{
public: int val1; int val2;
}; class Base2
{
public: int val3; int val4;
}; class Device : public Base1, public Base2
{
public: int vald;
}; void func1( int Device::*dmp, Device * pd )
{
printf( "Device::val3 = %d \n", pd->*dmp );
} void func2( Device * pd )
{
int Base2::*dmp = &Base2::val3;
printf( "&Base::val3 = %p \n", dmp );
func1( dmp, pd );
} int main()
{
Device a;
a.val1 = ; a.val2 = ; a.val3 = ; a.val4 = ; a.vald = ;
func2( &a ); return ;
}
测试结果

结论:编译器会自动转换父类member的offset
指向Data Member的指针测试(2)
#include <stdio.h> class Base1
{
public: int val1; int val2;
}; class Base2
{
public: int val3; int val4;
}; class Device : public Base1, public Base2
{
public: int vald;
}; int main()
{
printf( "&Base1::val1 = %p \n", &Base1::val1 );
printf( "&Base1::val2 = %p \n", &Base1::val2 );
printf( "&Base2::val3 = %p \n", &Base2::val3 );
printf( "&Base2::val4 = %p \n", &Base2::val4 );
printf( "&Device::val1 = %p \n", &Device::val1 );
printf( "&Device::val2 = %p \n", &Device::val2 );
printf( "&Device::val3 = %p \n", &Device::val3 );
printf( "&Device::val4 = %p \n", &Device::val4 );
printf( "&Device::vald = %p \n", &Device::vald );
return ;
}
测试结果

结论:继承的 member直接存放在Device中,因此vald的offset = sizeof(Base1) + sizeof(Base2) = 8 + 8 = 0x10;
指向Data Member的指针测试(3)
#include <stdio.h> class Base1
{
public: int val1; int val2;
}; class Base2
{
public: int val3; int val4;
}; class Device : virtual public Base1, virtual public Base2
{
public: int vald;
}; int main()
{
printf( "&Base1::val1 = %p \n", &Base1::val1 );
printf( "&Base1::val2 = %p \n", &Base1::val2 );
printf( "&Base2::val3 = %p \n", &Base2::val3 );
printf( "&Base2::val4 = %p \n", &Base2::val4 );
printf( "&Device::val1 = %p \n", &Device::val1 );
printf( "&Device::val2 = %p \n", &Device::val2 );
printf( "&Device::val3 = %p \n", &Device::val3 );
printf( "&Device::val4 = %p \n", &Device::val4 );
printf( "&Device::vald = %p \n", &Device::vald );
return ;
}
测试结果

结论:虚拟继承的父类被存放于一张表中,以指针指向,因此vald的offset = sizeof(*p) = 4;
深度探索C++对象模型读书笔记(2)的更多相关文章
- 【C++】深度探索C++对象模型读书笔记--Data语意学(The Semantics of data)
1. 一个空类的大小是1 byte.这是为了让这一类的两个对象得以在内存中配置独一无二的地址. 2. Nonstatic data member 放置的是“个别的class object”感兴趣的数据 ...
- 【C++】深度探索C++对象模型读书笔记--关于对象(Object Lessons)
前言中的内容: 1.什么是C++对象模型? 1.语言中直接支持面向对象程序设计的部分 2. 对于各种支持的底层实现机制 2. C++ class的完整virtual functions在编译时期就固定 ...
- 【C++】深度探索C++对象模型读书笔记--执行期语意学(Runtime Semantics)
对象的构造和析构: 全局对象 C++程序中所有的global objects都被放置在程序的data segment中.如果显式指定给它一个值,此object将以此值为初值.否则object所配置到的 ...
- 【C++】深度探索C++对象模型读书笔记--构造函数语义学(The Semantics of constructors)(四)
成员们的初始化队伍(member Initia 有四种情况必须使用member initialization list: 1. 当初始化一个reference member时: 2. 当初始化一个co ...
- 深度探索C++对象模型读书笔记-第七章站在对象模型的尖端
Template 模板是在编译时期而非执行时期被计算的.因此其不会带来效率的降低. 1: const Point<float> &ref = 0; 该语句会实例化一个Point的f ...
- 深度探索C++对象模型读书笔记-第六章执行期语意学
在函数中,编译器会帮助将析构函数(Destructor) 安插在相应的位置.对于函数中的局部对象,会将析构函数安插在对象的每一个离开点. 例如: 1: void Function(int a) { 2 ...
- 深入探索C++对象模型 读书笔记
第1章 关于对象 1.C++在布局以及存取时间上的主要的额外负担是由virtual引起的,包括: a.virtual function机制,引入vptr以及vtbl,支持一个有效率的"执行期 ...
- 《深度探索C++对象模型》笔记——Data语意学
Data Member的绑定 inline member functin躯体之内的一个data member绑定操作会在整个class声明完成之后才发生. argument list中的名称还是会在它 ...
- 《深度探索C++对象模型》笔记——Function语意学
member的各种调用方式 C++支持三种类型的member functions:static.nonstatic和virtual. nonstatic member functions会被编译器转换 ...
随机推荐
- delphi 01设置 字体属性
设置/获取 字体属性 名称 大小 粗体 斜体 下划线 删除线 颜色1 颜色2 uses MSHTML; //设置 //------------------------------------- ...
- HDU 1498 50 years, 50 colors (行列匹配+最小顶点覆盖)
题目:点击打开链接 题意:每个格子有不同颜色的气球用不同数字表示,每次可选某一行 或某一列来戳气球.每个人有K次机会.求最后哪些气球不能在 k次机会内 ...
- 使用导入导出进行备份和恢复OCR(10g)
Oracle推荐在对集群调整时,比方添加.删除节点之前,应对OCR进行备份,能够用export备份到指定文件.假设做了replace或者restore等操作,Oracle建议使用cluvfy comp ...
- EasyBCD 2.2中文版安装变色龙wowpc.iso详细教程(适用各个版本)
第一章 安装变色龙引导本章节提供3种安装方案,请自行选择 1.使用 Windows 版变色龙安装器安装适用引导方案:BIOS+MBR第1步:下载 Chameleon Install 2.2svn228 ...
- do {...} while (0) in macros
If you are a C programmer, you must be familiar with macros. They are powerful and can help you ease ...
- PHP.2-LAMP平台介绍及网站的工作原理
LAMP平台介绍及网站的工作原理 1.HTTP协议 URL(UniformResourceLocator)统一资源定位符,就是网页地址的意思.[格式:协议://主机.端口.文件.附加资源] ##URL ...
- CentOS(二)--初识linux的一些常用命令
linux命令是对Linux系统进行管理的命令.对于Linux系统来说,无论是中央处理器.内存.磁盘驱动器.键盘.鼠标,还是用户等都是文件,Linux系统管理的命令是它正常运行的核心,与之前的DOS命 ...
- 解决浏览器background-image属性不支持css3动画
问题 最近在使用background-image属性来实现css3的逐帧动画时,碰到了个问题.在chrome浏览器上,background-image属性是支持css3动画的,但是到了firefox上 ...
- win10 IIS10 HTTP 错误 404.2 - Not Found
环境win10系统IIS10里边发布web应用程序的时候,出现 HTTP 错误 404.2 - Not Found 由于 Web 服务器上的“ISAPI 和 CGI 限制”列表设置,无法提供您请求的页 ...
- js实现堆排序
<script type="text/javascript"> var arr = [22, 31, 1, 9, 99, 68, 55, 30]; function h ...