空基类优化—— EBCO—— empty base class optimization
完全参考自:《C++ Templates The Complete Guide》e_CN,p_281 16.2 空基类优化
最近周围有点吵,论文没看进去,随便翻了本书……
下文没有多大意义,只是解决了自己的一个疑惑。
1、为什么C++中不允许类的大小是0
class ZeroSizeT {};
ZeroSizeT z[];
&z[i] - &z[j];
一般是用两个地址之间的字节数除以类型大小而得到的,而类型大小是0将会出问题
2、为什么有时多个类组成实例所占空间都是一样的
class Empty
{ }; class EmptyToo : public Empty
{ }; class EmptyThree : public EmptyToo
{ }; sizeof(Empty) :
sizeof(EmptyToo) :
sizeof(EmptyThree) :
空基类优化:只要不会与同一类型的另一个对象或子对象分配在同一地址,就不需要为其分配空间
3、对于空基类优化,如何理解前提条件“只要不会与同一类型的另一个对象或子对象分配在同一地址”,以及why
class Empty
{ }; class EmptyToo : public Empty
{ }; class EmptyThree : public Empty, public EmptyToo
{ }; sizeof(Empty) :
sizeof(EmptyToo) :
sizeof(EmptyThree) :
NoEmpty的基类Empty和EmptyToo不能分配在同一地址空间,C++内存布局不允许相同类型的子对象偏移量相同。
对空基类优化进行限制的根本原因在于,我们需要能比较两个指针是否指向同一对象。由于指针几乎总是用地址作内部表示,因此必须保证两个不同的地址对应两个不同的对象。
附:
关于空基类优化的应用:在《C++ Templates The Complete Guide》e_CN的p_435中关于函数对象的组合问题,使用空基类优化的特性,将组合关系改成了继承关系。
空基类优化—— EBCO—— empty base class optimization的更多相关文章
- 空基类优化empty base class optimization
1.为什么C++中不允许类的大小是0 class ZeroSizeT {}; ZeroSizeT z[10]; &z[i] - &z[j]; 一般是用两个地址之间的字节数除以类型大小而 ...
- [百度空间] [原] Empty base class optimization
最近遇到了一个诡异的问题, 数组的数据不对, 最后发现是两个类型的大小不一样导致的. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 ...
- C#继承机制 访问与隐藏基类成员
(1) 访问基类成员 通过base 关键字访问基类的成员: 调用基类上已被其他方法重写的方法. 指定创建派生类实例时应调用的基类构造函数. 基类访问只能在构造函数.实例方法或实例属性访问器中进 ...
- thinkphp5底层基类封装、内部类函数
记录下thinkphp5自定义底层基类.内部类函数使用笔记 大部分笔记来自tp手册. 底层常用代码的封装 在控制器中基类的起着至关重要的作用,整个项目的代码安全,复杂程度,易读性都要看你项目的基类架构 ...
- python 打飞机项目 ( 基类封装 )
项目代码 | plane # -*- coding:utf-8 -*- import pygame, time from Plane import Plane from HeroPlane impor ...
- How to: Implement a Custom Base Persistent Class 如何:实现自定义持久化基类
XAF ships with the Business Class Library that contains a number of persistent classes ready for use ...
- C++ - 派生类访问模板基类(templatized base class)命名
派生类访问模板基类(templatized base class)命名 本文地址: http://blog.csdn.net/caroline_wendy/article/details/239936 ...
- object base基类分析
uvm_object,是所有uvm data和hierarchical class的基类,实现了copy,compare,print,record之类的函数 扩展类中必须实现create和get_ty ...
- django abstract base class ---- 抽象基类
抽象蕨类用于定义一些同享的列.类本身并不会在数据库端有表与之对应 一.例子: 1.定义一个叫Person 的抽象基类.Student 继承自Person from django.db import m ...
随机推荐
- 基于jQuery+CSS3实现人物跳动特效
分享一款基于jQuery+CSS3实现人物跳动特效.这是一款类似gif图片效果的CSS3动画特效代码.效果图如下: 在线预览 源码下载 实现的代码. html代码: <div class=& ...
- 使用EGit插件将Eclipse现有项目分享到git@osc
. . . . . 程序员一定要养成使用版本管理工具的好习惯,即使是自己一个人开发的项目也要加入到版本管理工具中.使用版本管理工具主要有两个好处:一个是更好的管理多个副本,这个优势不用说了:另一个就是 ...
- C# switch-case中的或(or)操作
今天需要在switch中添加一个条件,类似if中的 " || “操作 switch(var) { : : ... break; : : ... break; ... } 这样条件2 5会执行 ...
- putty配色备份
[HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\Sessions\Solarized%20Dark] "Colour0"="1 ...
- Android ——利用OnDraw实现自定义View(转)
自定义View的实现方式大概可以分为三种,自绘控件.组合控件.以及继承控件.本文将介绍自绘控件的用法.自绘控件的意思是,这个控件上的内容是用onDraw函数绘制出来的.关于onDraw函数的介绍可参看 ...
- while do while和for语句用法
while //循环 int i = 10; while(i > 0){ if(i==8) {i--; continue;//跳过 } System.out.println(--i); if(i ...
- 无线linux应用及配置--wifi配置
linux下应用wifi,AP侧运行程序hostapd,客户端运行wpa_supplicant.官网:http://w1.fi/. 无线网卡应用 无线网卡的应用服务程序为wpa_supplicant, ...
- Knockout开发中文API系列1
从本节开始介绍关于KnockoutJs相关的内容,本节主要介绍knockoutjs一些重要特性与优点,以及它与Jquery等框架库之间的区别. 1.Knockout.js是什么? Knockout是一 ...
- linux 获取网卡信息
sar -n DEV 2 10:41:37 AM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s10:41:39 AM eth ...
- 【C】——网络编程-聊天室
功能介绍: 此demo是基于TCP套接字编程,目的是实现一个聊天室效果.类似于QQ群效果,如果上线可以通知其他好友,下线也会通知其他好友. 需要用的技术: 一.socket编程. 1> sock ...