C++:空白基类最优化(empty base optimization, EBO) 详解

EBO, empty base optimization, 即空白基类最优化, 可以使派生类节省空间;

但是如果使用复合(composition)的方式, 因为定义了新对象, 所以编译器会进行填充(padding), 填充进一个int, 4位的空间;

代码:

/*************************************************
File: test.cpp
Copyright: C.L.Wang
Author: C.L.Wang
Date: 2014-04-11
Description: test
Email: morndragon@126.com
**************************************************/

/*eclipse cdt, gcc 4.8.1*/

#include <iostream>  

using namespace std;  

class Empty {};  

class HoldsAnInt {
private:
    int x;
    Empty e;
};  

class HoldsAnIntP : private Empty {
private:
    int x;
};  

int main () {
    std::cout << "Int : " << sizeof(int) << std::endl;
    std::cout << "HoldsAnInt(class) : " << sizeof(HoldsAnInt) << std::endl;
    std::cout << "HoldsAnIntP(inheritance) : " << sizeof(HoldsAnIntP) << std::endl;
    return 0;
}

输出:

Int : 4
HoldsAnInt(class) : 8
HoldsAnIntP(inheritance) : 4

作者:csdn博客 Spike_King

更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/cplus/

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索int
, class
, private
, 空白
, optimization
Empty
sas base 70题详解、baseadapter详解、cloudbase init详解、sas base 123题详解、sas base 123 详解,以便于您获取更多的相关知识。

时间: 2024-09-20 10:16:01

C++:空白基类最优化(empty base optimization, EBO) 详解的相关文章

Thrift的TProtocol类体系原理及源码详解:紧凑协议类TCompactProtocolT(TCom

Thrift的TProtocol类体系原理及源码详解:紧凑协议类TCompactProtocolT(TCompactProtocol) 这个协议类采用了zigzag 编码,这种编码是基于Variable-length quantity编码提出来 的,因为Variable-length quantity编码对于负数的编码都需要很长的字节数,而zigzag 编 码对于绝对值小的数字,无论正负都可以采用较少的字节来表示,充分利用了 Varint技术. 所以这个协议类采用zigzag 编码可以节省传输空

Thrift的TProtocol类体系原理及源码详解:二进制协议类TBinaryProtocolT(TBi

Thrift的TProtocol类体系原理及源码详解:二进制协议类TBinaryProtocolT(TBinaryProtocol) 这个协议是Thrift支持的默认二进制协议,它以二进制的格式写所有的数据,基本上直接 发送原始数据.因为它直接从TVirtualProtocol类继承,而且是一个模板类.它的模板参数 就是一个封装具体传输发送的类,这个类才是真正实现数据传输的.这个类的定义上一节举 例已经出现过了就不在列出来了. 下面我就结合scribe的Log函数执行的具体过程来 分析使用这个协

java-内部类和匿名内部类的区别,内部类和类成员的区别,忘详解!?大侠指教!

问题描述 内部类和匿名内部类的区别,内部类和类成员的区别,忘详解!?大侠指教! 在主程序的调用中内部类和匿名内部类区别和使用方法!内部类和类成员的区别! 解决方案 静态嵌套类和内部类的区别静态嵌套类和内部类的区别各种内部类的区别 解决方案二: http://www.cnblogs.com/mengdd/archive/2013/02/08/2909307.html 解决方案三: http://zhidao.baidu.com/link?url=p1LWkqBDH3R4ULFWPhxDiJ0R-s

instance-JAVA 匿名类的一个问题,求详解

问题描述 JAVA 匿名类的一个问题,求详解 请先看代码: static List intArrayAsList(final int[] a) { return new AbstractList() { public Object get(int i) { return new Integer(a[i]); } public int size() { return a.length; } public Object set(int i, Object o) { int oldVal = a[i]

C++聚合关系类的构造函数的调用顺序详解_C 语言

如图,表示一个聚合关系 下面就用简单的代码来实现 #pragma once class Engine { public: Engine(); ~Engine(); }; Engine.h #include <iostream> #include "Engine.h" using namespace std; Engine::Engine() { cout << "调用构造函数:Engine()" << endl; } Engine

thrift的TServer类体系原理及源码详解:服务器基类TServer

这一部分主要实现了底层IO通信,还涉及到通信服务器的堵塞.非堵塞.单线程.多线程 等运行模式,所以实现比较复杂.这一部分涉及到的类的关系图如下: 由上面的 类关系图可以看出,这一部分的类关系比较复杂,复杂的不是继承关系,而是相互之间的依 赖关系.因为服务器需要处理很多的任务,也需要处理多个客户端的连接,这就涉及到多线 程编程以及多线程之间通信及并发的情况.这一部分涉及到的并发编程的类容将在后面章节 单独分析,本章主要介绍服务器模型和IO通信的具体细节. 第一节 服务器基类 TServer 所有具

C++中派生类的构造和析构顺序详解

派生类因为要调用基类, 所以构造和析构都是按照一定顺序进行; 构造的顺序是: 基(base) -> 派生(derived);即先构造基类, 再构造派生类; 因为 基类 是独立于派生类的, 即不会调用派生类中的对象, 所以应该先被生成; 如果派生类先于基类生成, 则因为无法调用基类资源, 可能生成失败; 析构的顺序是: 派生(derived) -> 基(base); 即先释放派生类, 再释放基类; 因为 派生类 需要先释放调用的基类资源, 所以应该优先释放; 如果基类先析构, 则有可能某些资源被

Thrift的TProcess类体系原理及源码详解

之前对Thrift自动生成代码的实现细节做了详细的分析,下面进行处理层的实现做详细分 析了!会利用到自动代码生成的知识. 这部分是协议层和用户提供的服务实现之间的 纽带,定义了调用服务实现的接口框架,真正实现某种服务接口是通过上一章介绍的代码生 成工具生成的代码.本章将介绍这个框架的基本原理,然后通过生成的一个实例来具体介绍 怎样完成一次完整的服务,这个可能涉及到下面章节的一些知识,对于这些知识不详细分析 其功能,只是介绍它在其中起什么作用.选择的实例是Facebook内部用这个框架实现的一个

Python中的类与对象之描述符详解

 这篇文章主要介绍了Python中的描述符详解,属于Python学习过程中类与对象的基本知识,需要的朋友可以参考下     描述符(Descriptors)是Python语言中一个深奥但却重要的一部分.它们广泛应用于Python语言的内核,熟练掌握描述符将会为Python程序员的工具箱添加一个额外的技巧.为了给接下来对描述符的讨论做一些铺垫,我将描述一些程序员可能会在日常编程活动中遇到的场景,然后我将解释描述符是什么,以及它们如何为这些场景提供优雅的解决方案.在这篇总结中,我会使用新样式类来指代