以下测试平台均为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. leetcode || 53、Maximum Subarray

    problem: Find the contiguous subarray within an array (containing at least one number) which has the ...

  2. php的分表分库类

    <?php include 'config.php'; class Model{ //用户名 protected $user; //密码 protected $pwd; //主机 protect ...

  3. Programming Assignment 1: Percolation

    问题描述可以详见:http://coursera.cs.princeton.edu/algs4/assignments/percolation.html 关于QuickFindUF的javadoc:h ...

  4. 带约束优化问题 拉格朗日 对偶问题 KKT条件

    转自:七月算法社区http://ask.julyedu.com/question/276 咨询:带约束优化问题 拉格朗日 对偶问题 KKT条件 关注 | 22 ... 咨询下各位,在机器学习相关内容中 ...

  5. mysql表名大小写问题

               默认情况下,MySQL 将以小写保存表名.一个避免 MySQL 服务器小写问题方法是以 -O lower_case_table_names=0 启动 mysqld.默认情况下,这 ...

  6. SQL Server 通配符 Wildcard character

    SQL Server 通配符 Wildcard character %        任意长度的字符串,如:'%computer%' _        单个字符,如:'_ean' []        ...

  7. Linux parted 分区

    转自http://tilt.lib.tsinghua.edu.cn/node/889 如何使用parted对齐分区以得到最优性能   Sat, 03/08/2014 - 18:02 - tlblues ...

  8. Kali+Win7双系统

    ----------------------------------------------------------前言---------------------------------------- ...

  9. linux内存查看

    一般用free命令,显示整体内存使用状况: 第二行从OS角度,used包括内核+应用+buffers+cached使用的内存,buffers/cached是磁盘缓存的大小 第三行从应用角度,可用内存= ...

  10. 解决浏览器background-image属性不支持css3动画

    问题 最近在使用background-image属性来实现css3的逐帧动画时,碰到了个问题.在chrome浏览器上,background-image属性是支持css3动画的,但是到了firefox上 ...