深度探索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会被编译器转换 ...
随机推荐
- Swift计算属性
除存储属性外,类.结构体和枚举可以定义计算属性,计算属性不直接存储值,而是提供一个 getter 来获取值,一个可选的 setter 来间接设置其他属性或变量的值. struct Point { va ...
- 分享php中四种webservice实现的简单架构方法及实例(转)
本人所了解的webservice有以下几种:PHP本身的SOAP,开源的NUSOAP,商业版的PHPRPC,以及使用二进制传输数据流的 HessianPHP,那么一下就简单的介绍下这几种webserv ...
- Metadata Lock原理6
一 简介 上一篇文章 <MetaData Lock 之一> 简单的介绍了MySQL 引入MDL 的前因后果,本文深入了解MDL的实现原理和运行机制.二 MDL 的类型 meta ...
- 使用 T4 文本模板生成设计时代码
使用设计时 T4 文本模板,您可以在 Visual Studio 项目中生成程序代码和其他文件. 通常,您编写一些模板,以便它们根据来自模型的数据来改变所生成的代码. 模型是包含有关应用程序要求的 ...
- iOS 开发常用宏
来源:iOS_小松哥 链接:http://www.jianshu.com/p/be00c3f3cafd 大家都是知道使用宏不仅方便,而且可以提高开发效率.下面总结了iOS开发过程中的一些常用宏,会持续 ...
- cocos2d-x lua table与json的转换
cocos2d-x lua table与json的转换 version: cocos2d-x 3.6 1.引入json库 require("src/cocos/cocos2d/json&qu ...
- jQuery扩展工具方法
共享学习Jquery源码的一些东西 jQuery.extend({ expando : 生成唯一JQ字符串(内部) noConflict() : 防止冲突 ---------------- ...
- block的简单使用:点击按钮在另一个控制器内调用block内的代码
1.自定义一个继承于UIButton的按钮 2.声明block: 返回值类型 函数名 参数列表 typedef void (^ButtonBlock)(UIButton *); @interfa ...
- velocity基本用法
1.定义变量 #set($root="www");#set($name="index.vm");#set($tmp="$root/$name" ...
- LeetCode 80
Remove Duplicates from Sorted Array II Follow up for "Remove Duplicates": What if duplicat ...