首先给出以下例子:

class X{};
class Y:public virtual X{};
class Z:public virtual X{};
class A:public Y,public Z{};
sizeof(X);//1
sizeof(Y);//8
sizeof(Z);//8
sizeof(A);//12

Y,Z的内存大小受三个因素的影响:

1.语言本身造成的额外负担,指的是虚继承中在类中会产生一个指向虚表的指针,这个指针在32位的系统下是4个字节。

2.编译器对特殊情况提供的优化处理。

3.alignment限制。

Class A的大小由以下几点决定

1.被共享的 class X,为1字节。

2.class Y的大小,要减去因virtual base class X而配置的大小,结果是4bit,Z同理,Y+Z=8。

3.class A自身是0字节。

4.class A的内存对齐,8+1=9字节,要调整为4的边界,需要补充3个字节,所以结果是12个字节。


Data member的布局

Static data members只有一个实体,存放在程序的data segment中,每次程序取用static member,都会被内部转化为对该唯一的extern实体的直接参考操作。

Origin.chunkSize=50;
//等价于这个
Point3d::chunkSize=50;

若取一个static data member的地址,会得到一个指向其数据类型的指针,而不是一个指向其class member 的指针,因为static member并不内含在一个class object之中。

&Point3d::chunkSize;//会得到const int*类型

如何区分一个”没有指向任何data member“的指针和一个指向”第一个data member“的指针?例如:

float Point::*p1=0;
float Point::*p2=&Point::x;
if(p1==p2)
{
//do something..
}

为了区分p1和p2,每一个真正的member offset值都要加上1,如果要使用该值来指出一个member,要先减去1.


指向members的指针的效率问题

为每一个“member存取操作”加上一层间接性(经由已经绑定的指针)会使得执行时间多出1倍不止,以“指向member的指针”来存取数据,再一次几乎用掉了双倍的时间,要把“指向member的指针”绑定到class object上,需要额外地把offset减去1.

《深度探索C++对象模型》第三章 Data语意学的更多相关文章

  1. 《深度探索C++对象模型》第二章 | 构造函数语意学

    默认构造函数的构建操作 默认构造函数在需要的时候被编译器合成出来.这里"在需要的时候"指的是编译器需要的时候. 带有默认构造函数的成员对象 如果一个类没有任何构造函数,但是它包含一 ...

  2. Android深度探索-卷1第三章心得体会

    第三章整章介绍了git,git是一个开源的分布式版本控制系统,用以有效.高速的处理从很小到非常大的项目版本管理.通过配置git后可以很方便的找到需要的资源,更多的是代码和包,可以在本地建立版本库,为了 ...

  3. 深度探索C++对象模型之第一章:关于对象之对象的差异

    一.三种程序设计范式: C++程序设计模型支持三种程序设计范式(programming paradiams). 程序模型(procedural model) char boy[] = "cc ...

  4. 深度探索C++对象模型之第一章:关于对象之C++对象模型

    一.C和C++对比: C语言的Point3d: 数据成员定义在结构体之内,存在一组各个以功能为导向的函数中,共同处理外部的数据. typedef struct point3d { float x; f ...

  5. 深度探索C++对象模型之第二章:构造函数语意学之Copy constructor的构造操作

    C++ Standard将copy constructor分为trivial 和nontrivial两种:只有nontrivial的实例才会被合成于程序之中.决定一个copy constructor是 ...

  6. 深度探索C++对象模型之第二章:构造函数语意学之Default constructor的构造操作

    C++新手一般由两个常见的误解: 如果任何class没有定义默认构造函数(default constructor),编译器就会合成一个来. 编译器合成的的default constructor会显示的 ...

  7. 深度探索C++对象模型之第二章:构造函数语意学之成员初始值列表

    当我们需要设置class member的初值时,要么是经过member initialization list ,要么在construcotr内. 一.先讨论必须使用member initializa ...

  8. 深度探索C++对象模型第四章:函数语义学

    C++有三种类型的成员函数:static/nonstatic/virtual 一.成员的各种调用方式 C with class 只支持非静态成员函数(Nonstatic member function ...

  9. 深度探索C++对象模型之第一章:关于对象之关键词所引起的差异

    ————如果不是为了努力维护与C之间的兼容性,C++远比现在简单的多. 如果一个程序员渴望学习C++,但是他却发现书中没有熟悉的struct,一定会苦恼,将这个主题包含到C++里,可以提供语言转移时的 ...

  10. 《深度探索C++对象模型》第一章 | 关于对象

    C++对象模式 非静态数据成员放置在每个类对象内,静态数据成员则被放置在所有类对象之外.静态和非静态的成员函数也被放置在所有类对象之外.每个类产生一堆指向虚函数的指针,放在虚表(vtbl)中.每个类对 ...

随机推荐

  1. Mysql通过Canal同步Elasticsearch

    目录 版本管理 Mysql 设置 在MySQL配置文件my.cnf设置: 检查是否开启 增加新用户: 安装 Elasticsearch es 跨域问题 目录挂载 安装 Elasticsearch-He ...

  2. python基础之常用数据类型和字符串

    一.数据类型 在python3中有六大标准数据类型:Numbers(数字).String(字符串).List(列表).Tuple(元组).Sets(集合).Dictionaries(字典). 其中: ...

  3. Python爬虫requests请求库

    requests:pip install  request 安装 实例: import requestsurl = 'http://www.baidu.com'response = requests. ...

  4. Java基础面试总结

    常见编译型语言:C.C++.Go.Rust 等(执行速度快,但开发效率低) 常见解释型语言:Python.JavaScript.PHP(开发效率高,但执行效率低) 先编译后解释:Java 重载和重写有 ...

  5. 前端学习笔记--HTML5

    网页的优点(客户端为网页)(B/S)模式 开发成本低) 不需要安装 无需更新 跨平台(最重要)可以有效的减小开发成本 传统的为C/S模式,开发成本高 前端工程师负责写网页的源代码,而浏览器负责把网页渲 ...

  6. scrapy出现SSL问题 如何解决? <twisted.python.failure.Failure OpenSSL.SSL.Error: [('SSL routines', '', 'unsafe legacy renegotiation disabled')]>

    问题:<twisted.python.failure.Failure OpenSSL.SSL.Error: [('SSL routines', '', 'unsafe legacy renego ...

  7. jmeter——JSON提取器(从上一个请求的响应结果提取参数传给下一个请求)

    记录一个参数提取过程,可供后续参考. 1. 查看响应报文的结构 将上一个请求的响应报文复制到Notepad++编辑器 JSON Viewer是Notepad++的JSON插件, Notepad++的P ...

  8. js高级之对象高级部分

    基于尚硅谷的尚硅谷JavaScript高级教程提供笔记撰写,加入一些个人理解 github源码 博客下载 对象的创建模式 Object构造函数模式 套路: 先创建空Object对象, 再动态添加属性/ ...

  9. 2022-11-04 Acwing每日一题

    本系列所有题目均为Acwing课的内容,发表博客既是为了学习总结,加深自己的印象,同时也是为了以后回过头来看时,不会感叹虚度光阴罢了,因此如果出现错误,欢迎大家能够指出错误,我会认真改正的.同时也希望 ...

  10. 带你了解S12直播中的“黑科技”

    摘要:让精彩更流畅.让较量更清晰.让参与更沉浸.让体验更有趣,幕后的舞台,从来都是技术的战场,S12背后的名场面同样场场高能. 本文分享自华为云社区<用硬核方式打开S12名场面>,作者:华 ...