注:本文测试实例使用的编译器版本为clang-703.0.29,系统int长度为4字节,指针长度为8字节。

1. 空类

class A {};

空类sizeof的结果为1,为什么不是0呢?因为C++标准规定两个不同实例的内存地址必须不同(戳这里),所以用这一个字节来占用不同的内存地址,让空类的两个实例可以相互区分。而大多数编译器支持空基类优化(Empty Base Class Optimization, EBCO),即从空基类中派生出来的类并不会增加1字节,如:

class B : A {
int a;
};

sizeof(B)的结果为4而不是5或8。

2. 带静态数据成员的类

class C {
int a;
static int b;
};

sizeof(C)结果为4,静态数据成员被存放在类对象之外。

3. 带非虚函数成员的类

class D {
public:
void func1() {}
static void func2() {}
};

sizeof(D)结果为1,无论是普通成员函数还是静态成员函数都被存放在类对象之外。

4. 带虚函数成员的类

class E {
public:
virtual void func() {}
};

sizeof(E)结果为8,带虚函数成员的类对象会包含一个指向该类的virtual table的指针。

5. 对齐规则

class F {
char a;
int b;
};

sizeof(F)的结果为8而不是5,由于F的最大对齐值为4(int),因此a和b之间被补齐3字节。

6. 普通派生类

class G : public C {
int a;
};

sizeof(G)的结果为8,派生类会存放基类中非静态数据成员(C中的a)的副本。

7. 基类带虚函数的派生类

class H : public E {};

sizeof(H)结果为8,由于基类中带虚函数,派生类中也必须保存一个指向派生类的virtual table的指针。

8. 多重继承的派生类

class I : public B, public C {};

sizeof(I)结果为8,B和C中非静态数据成员长度以及是否需要指向virtual table的指针的情况加和。

9. 多重继承下的对齐规则

class J : public B, public F {
char a;
};

sizeof(J)结果为16,B、F和J类中共有两个int两个char,对齐后4*4结果为16。

10. 虚继承的派生类

class K : virtual public A {};

class L : virtual public B {};

sizeof(K)的结果为8,派生类中会存放一个指向虚继承基类唯一实例的指针。sizeof(L)的结果为16,因为对齐规则int被补齐。注意虚继承和虚函数是两个完全不同的概念,它们之间没有直接联系。

class M : virtual public A {};

class N : public K, public M {};

sizeof(N)的结果为16,虽然K类和M类中的虚继承指针指向了同一个基类实例,但它们是不同的指针,N类中需要同时存放这两个指针。

C++中各种类的大小的更多相关文章

  1. SQL Server:统计数据库中每张表的大小

    1. 统计数据库中每张表的大小 1.1 首先执行下面的命令 exec sp_MSforeachtable @command1="sp_spaceused '?'"; 1.2 检测当 ...

  2. Wordpress编辑器(Tinymce)在Chrome中动态修改图片大小

    Chrome不支持tinymce中图片动态修改大小,可以在theme的functions.php中加入下面代码在Tinymce中模拟这一功能: function tinymce_editor_sett ...

  3. ORA-00379 缓冲池 DEFAULT 中无法提供 32K 块大小的空闲缓冲区

    (一)问题 今天在使用Pl/sql developer查看表空间大小的时候,报错误:ORA-00379 缓冲池 DEFAULT 中无法提供 32K 块大小的空闲缓冲区,具体如下图: SQL> s ...

  4. 在 sql server 中,查询 数据库的大小 和 数据库中各表的大小

    其实本来只想找一个方法能查询一下 数据库 的大小,没想到这个方法还能查询数据库中 各个数据表 的大小,嗯,挺好玩的,记录一下. MSDN资料:https://msdn.microsoft.com/zh ...

  5. SQL Server 查看数据库在数据缓存(data cache)中占用的空间大小

    use master go select * from sys.dm_os_buffer_descriptors go --查看数据库在数据缓存(data cache)中占用的空间大小 --由于每个数 ...

  6. Java中计算对象的大小

    一.计算对象大小的方法 Java中如何计算对象的大小呢,找到了4种方法: 1.java.lang.instrument.Instrumentation的getObjectSize方法: 2.BTrac ...

  7. Java中,数值比较大小,以及数值判断相等

    Java中,数值比较大小,以及数值判断相等

  8. 查看mysql库中所有表的大小和记录数

    查看mysql库中所有表的大小和记录数 ,), 'MB') as total_size FROM information_schema.TABLES WHERE TABLE_SCHEMA='datab ...

  9. 在Eclipse Android中设置模拟器屏幕大小

    在Eclipse Android中设置模拟器屏幕大小是本文要介绍的内容,主要是来了解并学习Eclipse Android中模拟器的设置,具体关于Eclipse Android内容的详解来看本文. 方法 ...

随机推荐

  1. MapGIS Mobile开发

    1. 先将Android开发环境配置好(包括Java + Eclipse + Android SDK) 2. 加载API类库(运行MapGIS 10 AndroidSDK.exe可以加载Mobile框 ...

  2. JAVA中的内联函数

    在说内联函数之前,先说说函数的调用过程. 调用某个函数实际上将程序执行顺序转移到该函数所存放在内存中某个地址,将函数的程序内容执行完后,再返回到 转去执行该函数前的地方.这种转移操作要求在转去前要保护 ...

  3. 西邮Linux兴趣小组2014级免试挑战题 (续)

    在上一篇的博客中已经解到第四关了,现在继续挑战-- [ 第四关] 在上一关解压成功后,生成了一个file文件.用vim的二进制格式打开,转成十六进制,发现文件头格式如下: 是个以ELF字符开头的文件, ...

  4. 1028. Hanoi Tower Sequence

    1028. Hanoi Tower Sequence Constraints Time Limit: 1 secs, Memory Limit: 32 MB Description Hanoi Tow ...

  5. java web代码规范:

    每个类前要有注释,类前的注释格式是: /** *类是干什么的 *@author  编写该类的作者 */ 类中的每个方法前也要有注释: /** *该方法是干什么的 *@param 该方法中传入的参数 * ...

  6. SSH中设置字符编码防止乱码

    1.在web.xml中加入一个过滤器和过滤范围的配置 <filter><filter-name>encoding</filter-name><filter-c ...

  7. ABP 框架代码批量生成器

    需要最新源码,或技术提问,请加QQ群:538327407 我的各种github 开源项目和代码:https://github.com/linbin524 简介 用abp 框架快两年了,用它完成了多个项 ...

  8. 初探angluar_01 目录结构分析及初始化项目

    简单说明:angular是模块化的,因此所有功能功能都属于组件 一.目录结构 e2e 端到端的测试目录  用来做自动测试的 node_modules 安装地依赖存放目录,package.json里安装 ...

  9. Jmeter——参数化的9种方法

    本文由作者张迎贞授权网易云社区发布. 一.用户定义的变量 1.右键快捷菜单中选择 添加-配置元件-用户自定义变量. 用户自定义变量中的定义的所有参数的值在测试计划的执行过程中不能发生取值的改变,因此一 ...

  10. KMP Demo

    The key of Kmp is to build a look up table that records the match result of prefix and postfix. Valu ...