以下测试平台均为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)的更多相关文章

  1. 【C++】深度探索C++对象模型读书笔记--Data语意学(The Semantics of data)

    1. 一个空类的大小是1 byte.这是为了让这一类的两个对象得以在内存中配置独一无二的地址. 2. Nonstatic data member 放置的是“个别的class object”感兴趣的数据 ...

  2. 【C++】深度探索C++对象模型读书笔记--关于对象(Object Lessons)

    前言中的内容: 1.什么是C++对象模型? 1.语言中直接支持面向对象程序设计的部分 2. 对于各种支持的底层实现机制 2. C++ class的完整virtual functions在编译时期就固定 ...

  3. 【C++】深度探索C++对象模型读书笔记--执行期语意学(Runtime Semantics)

    对象的构造和析构: 全局对象 C++程序中所有的global objects都被放置在程序的data segment中.如果显式指定给它一个值,此object将以此值为初值.否则object所配置到的 ...

  4. 【C++】深度探索C++对象模型读书笔记--构造函数语义学(The Semantics of constructors)(四)

    成员们的初始化队伍(member Initia 有四种情况必须使用member initialization list: 1. 当初始化一个reference member时: 2. 当初始化一个co ...

  5. 深度探索C++对象模型读书笔记-第七章站在对象模型的尖端

    Template 模板是在编译时期而非执行时期被计算的.因此其不会带来效率的降低. 1: const Point<float> &ref = 0; 该语句会实例化一个Point的f ...

  6. 深度探索C++对象模型读书笔记-第六章执行期语意学

    在函数中,编译器会帮助将析构函数(Destructor) 安插在相应的位置.对于函数中的局部对象,会将析构函数安插在对象的每一个离开点. 例如: 1: void Function(int a) { 2 ...

  7. 深入探索C++对象模型 读书笔记

    第1章 关于对象 1.C++在布局以及存取时间上的主要的额外负担是由virtual引起的,包括: a.virtual function机制,引入vptr以及vtbl,支持一个有效率的"执行期 ...

  8. 《深度探索C++对象模型》笔记——Data语意学

    Data Member的绑定 inline member functin躯体之内的一个data member绑定操作会在整个class声明完成之后才发生. argument list中的名称还是会在它 ...

  9. 《深度探索C++对象模型》笔记——Function语意学

    member的各种调用方式 C++支持三种类型的member functions:static.nonstatic和virtual. nonstatic member functions会被编译器转换 ...

随机推荐

  1. 图解JS原型链

    一:任何一个对象都有一个prototype的属性,在js中可以把它记为:__proto__ 当初ECMAscript的发明者为了简化这门语言,同时又保持继承的属性,于是就设计了这个链表.. 在数据结构 ...

  2. jsonp跨域原理解析

    前言: 跨域请求是前台开发中经常遇到的场景,但是由于浏览器同源策略,导致A域下普通的http请求没法加载B域下的数据,跨域问题由此产生.但是通过script标签的方式却可以加载非同域下的js,因此可以 ...

  3. 关于File.getPath,File.getAbsolutePath,File.getCanonicalPath的区别

    这个问题, 不了解一下还是挺恍惚它们之间的区别的. 其实也挺简单的. getPath()-->>new File()时的路径 getAbsolutePath()-->>当前路径 ...

  4. C. Fox And Names

    C. Fox And Names time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...

  5. struts2.1笔记06:struts2开发环境的搭建实际操作出现的问题

    1.我根据新建一个struts工程之后,启动报错,如下: 六月 29, 2015 3:08:18 下午 org.apache.catalina.core.AprLifecycleListener in ...

  6. linux下 yum源、rpm、源代码安装mysql

    mysql的安装 一.yum源格式安装mysql 1.将下载的yum包上传到linux上: [root@localhost ~]# ls mysql-community-release-el6-5.n ...

  7. JDK的安装

    安装jdk解压拷贝过来的jdk(1.6版本)压缩包 cd /usr/local/tar xzvf /tmp/jdk.tgz 修改环境变量vi /etc/profile 加入如下内容export JAV ...

  8. hdu 4666 最大曼哈顿距离

    思路:这题我是看了题目后,上百度搜了一下才知道还有求最大曼哈顿距离的方法.直接把代码copy过来,研读一下,知道了代码实现机制,自然就很容易想到用优先队列来维护每种状态下的xi,yi之和的最大值最小值 ...

  9. hdu 4619 最大匹配问题

    思路:把所有涉及到的点按(x+y)的奇偶分成两部分点,对所有的1*2的骨牌,都有(x+y)为偶数的建到奇数的边.求一次最大匹配,就是答案. #include<iostream> #incl ...

  10. 如何评价微信小程序?

    这次我不站张小龙,虽然他说的「用完即走」的道理在,但我并不认为小程序会形成生态. (一) 仅仅从抽象场景上来讲,小程序当然很美好. 对开发者来说,不用费尽心思开发好多平台的 APP 了,不用考虑适配各 ...