《深度探索c++对象模型》chapter3 Data语意学
一个空的class:如
class X{} ;
sizeof(X)==1;
sizeof为什么为1,他有一个隐晦的1 byte,那是被编译器安插进去的一个char,这使得class2的两个objects得以在内存中配置独一无二的地址:
X a,b;
if(&a==&b) cerr<<"yipes!"<<endl;
class X{};
class Y:public virtual X{};
class Z:public virtual X{};
class A:public Y,public Z{};
cout<<"sizeof(X):"<<sizeof(X)<<endl;
cout<<"sizeof(Y):"<<sizeof(Y)<<endl;
cout<<"sizeof(Z):"<<sizeof(Z)<<endl;
cout<<"sizeof(A):"<<sizeof(A)<<endl;
我的vs结果是1 ,4,4,8.
但是让人搞不懂的是Y、Z的大小。主要大小受三个因素的影响:
- 语言本身所造成的额外负担,当语言支持虚基类virtual base class的时候,就导致一个额外的负担,这个一般反映在某种形式的指针身上,它或者指向virtual base class subobject,或者指向一个相关表格。
- 编译器对于特殊情况所提供的优化处理,因为class X有1 byte的大小,这样就出现在了class Y和class Z身上。这个主要视编译器而定,比如某些存在这个1byte但是有些编译器就将他忽略了(因为已经用虚指针了所以这个1byte就可以不用作为内存中的一个定位)。这种情况是对empty virtual base的特殊处理,如VS。
- Alignment的限制,就是所谓的对齐操作,比如你现在占用5bytes编译器为了更有效率地在内存中存取就将其对齐为8byte。
- 下面说明在vs2010中的模型,因为有了虚指针后所以1byte就不用了,所以class Y和class Z的大小就是4bytes,如下图:

现在你觉得class A的大小应该是多少呢?一个虚基类子对象只会在派生类中存在一份实体,不管他在继承体系中出现多少次,所以公用一个1byte的classX实体,再加上class Y和class Z这样就有9bytes,如果有对齐的话就是12bytes但是vs2010中省略了那1byte所以就不存在对齐就直接是8bytes。谜底终于揭开了!!!
Data Member的绑定:the binding of a data member
Data Member的布局
类的static data member会放在程序的数据段(data segment)。
c++ standard要求,在同一个access section中,member的排列只需符合”较晚出现的members在class object中有较高的地址“这一条件即可。也就是说,各个members并不一定得连续排列。什么东西可能会介于被声明的members之间呢?members的边界调整(alignment)可能就需要填补一些bytes。
不同的access section的数据们放置没有强制的前后关系。vptr的放置也没有强制规定。
Data Member的存取
必须通过对象才能访问nonstatic data member(要不然访问的是谁的data member呢)。方法为对象的地址加上data member的offset就是这个data member的地址。
但在有虚拟继承的情况下,由于“经由base class subject存取class member”导入一层新的间接性,访问的时候,会有不同。考虑如下代码:
Point3d origin, *pt;
origin.x = 0;
pt->x;
由于origin一定是Point3d类型,所以origin.x编译时即可确定其offset。
《深度探索c++对象模型》chapter3 Data语意学的更多相关文章
- 【深度探索C++对象模型】data语义学
class X{}; class Y :public virtual X{}; class Z :public virtual X{}; class A :public Y, public Z{}; ...
- c++学习书籍推荐《深度探索C++对象模型》下载
百度云及其他网盘下载地址:点我 百度云及其他网盘下载地址:点我 编辑推荐 如果你是一位C++程序员,渴望对于底层知识获得一个完整的了解,那么这本<深度探索C++对象模型>正适合你 作者简介 ...
- [读书系列] 深度探索C++对象模型 初读
2012年底-2014年初这段时间主要用C++做手游开发,时隔3年,重新拿起<深度探索C++对象模型>这本书,感觉生疏了很多,如果按前阵子的生疏度来说,现在不借助Visual Studio ...
- 拾遗与填坑《深度探索C++对象模型》3.3节
<深度探索C++对象模型>是一本好书,该书作者也是<C++ Primer>的作者,一位绝对的C++大师.诚然该书中也有多多少少的错误一直为人所诟病,但这仍然不妨碍称其为一本好书 ...
- 拾遗与填坑《深度探索C++对象模型》3.2节
<深度探索C++对象模型>是一本好书,该书作者也是<C++ Primer>的作者,一位绝对的C++大师.诚然该书中也有多多少少的错误一直为人所诟病,但这仍然不妨碍称其为一本好书 ...
- 深度探索C++对象模型
深度探索C++对象模型 什么是C++对象模型: 语言中直接支持面向对象程序设计的部分. 对于各个支持的底层实现机制. 抽象性与实际性之间找出平衡点, 需要知识, 经验以及许多思考. 导读 这本书是C+ ...
- 《深度探索C++对象模型》读书笔记(一)
前言 今年中下旬就要找工作了,我计划从现在就开始准备一些面试中会问到的基础知识,包括C++.操作系统.计算机网络.算法和数据结构等.C++就先从这本<深度探索C++对象模型>开始.不同于& ...
- 读书笔记《深度探索c++对象模型》 概述
<深度探索c++对象模型>这本书是我工作一段时间后想更深入了解C++的底层实现知识,如内存布局.模型.内存大小.继承.虚函数表等而阅读的:此外在很多面试或者工作中,对底层的知识的足够了解也 ...
- 柔性数组-读《深度探索C++对象模型》有感 (转载)
最近在看<深度探索C++对象模型>,对于Struct的用法中,发现有一些地方值得我们借鉴的地方,特此和大家分享一下,此间内容包含了网上搜集的一些资料,同时感谢提供这些信息的作者. 原文如下 ...
- 柔性数组-读《深度探索C++对象模型》有感
最近在看<深度探索C++对象模型>,对于Struct的用法中,发现有一些地方值得我们借鉴的地方,特此和大家分享一下,此间内容包含了网上搜集的一些资料,同时感谢提供这些信息的作者. 原文如下 ...
随机推荐
- oracle分组查询
分组函数 在分组函数中,如果有一个查找项分组,其他项必须也分组,比如下面的语句会报错,因为sal分组了,而ename没有分组: 1.显示工资最高的员工: 2.显示所有员工的平均工资: 2.1使用系统函 ...
- List和ArrayList,LinkList的区别
接口 List<E> 是一个接口: ArrayList<E> 是一个类:是一个实现了List接口的类,因此可以List里面定义的所有的方法都实现了. 1.ArrayList是实 ...
- HTML基础(1) 全局架构标签,特殊字符
最基本的网页文件组成部分 其中 <head></head> 这个标签对中内容不会显示在网页中 <body></body> 中的内容可以显示在网页中. b ...
- windows 8 vpn 错误解决
最近微软发布了Windows 8 RTM版,很多朋友也安装了,我当然也不例外.这几天就有不少朋友问我VPN连接无论怎么都说密码错误不能验证,于是,便连接VPN进行了下测试,如下: 配置好VPN,步凑不 ...
- asp.net 操作INI文件的读写,读写操作本地ini配置文件
using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Secu ...
- Angularjs总结(一)表单验证
常用的表单验证1.必须字段html5特性 增加required <input type="text" required /> 2.最小长度和最大长度 <input ...
- 转:Windows 8上强制Visual Studio以管理员身份运行
Windows 8的一个既安全又蛋疼之处是UAC的行为被改变了.以往在Windows 7中,只要关闭了UAC,自己的帐号又是本机管理员组的,任何程序都会以管理员身份启动.然而,在Windows 8上, ...
- 《转》前端性能优化----yahoo前端性能团队总结的35条黄金定律
除了自己总结:1. 减少http请求,2.压缩并优化js/css/image 3.尽量静态页面,从简原则 4.代码规范(详见:个人知识体系思维导图) 从yahoo 新学到的: 网页内容 减少http请 ...
- 百练_2409 Let it Bead(Polya定理)
描述 "Let it Bead" company is located upstairs at 700 Cannery Row in Monterey, CA. As you ca ...
- Codeforces 551E - GukiZ and GukiZiana(分块)
Problem E. GukiZ and GukiZiana Solution: 先分成N=sqrt(n)块,然后对这N块进行排序. 利用二分查找确定最前面和最后面的位置. #include < ...