C++中各种类的大小
注:本文测试实例使用的编译器版本为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++中各种类的大小的更多相关文章
- SQL Server:统计数据库中每张表的大小
1. 统计数据库中每张表的大小 1.1 首先执行下面的命令 exec sp_MSforeachtable @command1="sp_spaceused '?'"; 1.2 检测当 ...
- Wordpress编辑器(Tinymce)在Chrome中动态修改图片大小
Chrome不支持tinymce中图片动态修改大小,可以在theme的functions.php中加入下面代码在Tinymce中模拟这一功能: function tinymce_editor_sett ...
- ORA-00379 缓冲池 DEFAULT 中无法提供 32K 块大小的空闲缓冲区
(一)问题 今天在使用Pl/sql developer查看表空间大小的时候,报错误:ORA-00379 缓冲池 DEFAULT 中无法提供 32K 块大小的空闲缓冲区,具体如下图: SQL> s ...
- 在 sql server 中,查询 数据库的大小 和 数据库中各表的大小
其实本来只想找一个方法能查询一下 数据库 的大小,没想到这个方法还能查询数据库中 各个数据表 的大小,嗯,挺好玩的,记录一下. MSDN资料:https://msdn.microsoft.com/zh ...
- SQL Server 查看数据库在数据缓存(data cache)中占用的空间大小
use master go select * from sys.dm_os_buffer_descriptors go --查看数据库在数据缓存(data cache)中占用的空间大小 --由于每个数 ...
- Java中计算对象的大小
一.计算对象大小的方法 Java中如何计算对象的大小呢,找到了4种方法: 1.java.lang.instrument.Instrumentation的getObjectSize方法: 2.BTrac ...
- Java中,数值比较大小,以及数值判断相等
Java中,数值比较大小,以及数值判断相等
- 查看mysql库中所有表的大小和记录数
查看mysql库中所有表的大小和记录数 ,), 'MB') as total_size FROM information_schema.TABLES WHERE TABLE_SCHEMA='datab ...
- 在Eclipse Android中设置模拟器屏幕大小
在Eclipse Android中设置模拟器屏幕大小是本文要介绍的内容,主要是来了解并学习Eclipse Android中模拟器的设置,具体关于Eclipse Android内容的详解来看本文. 方法 ...
随机推荐
- 2、WindowManager源码分析--最后一战
在最后一站中,几乎所有的UI界面都是这个WindowManager管理的,那么他是如何调度的呢?我们来看看一些项目中的界面. 上面有登陆界面,专门管理登陆.战斗界面,用户界面,专门管理用户属性等等. ...
- Android 3D游戏开发
OpenGL ES(OpenGL Embedded System) Android 3D游戏开发技术宝典:OpenGL ES 2.0(android 3d游戏开发技术宝典 -opengl es 2.0 ...
- MFC自动生成代码详解(一)
首先声明这篇博客是给MFC刚刚上路的coder准备的,老鸟们就自觉无视我吧! 大家有没有感觉,创建MFC工程时他总会生成一大堆文件一大堆代码.虽然给我们带来了便利,但是调试的时候碰到这些代码总是畏首畏 ...
- Hibernate 的复杂用法HibernateCallback
HibernateTemplate还提供了一种更加灵活的方式来操作数据库,通过这种方式可以完全使用Hibernate的操作方式.HibernateTemplate的灵活访问方式可通过如下两个方法完成: ...
- Oracle EBS标准错误信息如何追踪 (Debug)
http://www.cnblogs.com/songdavid/articles/2067534.html 调用EBS标准API的时候,可能会返回一些让人看不懂的错误,比如最近我在开发rcv_tra ...
- AME
http://wenku.baidu.com/view/a9dbebc789eb172ded63b7f4.htmlhttp://wenku.baidu.com/view/dde6eb040740be1 ...
- WPF中得到一个控件相对其他控件的坐标
加入想得到按钮btnTest左上角相对于主窗体winTest的坐标,可以用如下方法:btnTest.TranslatePoint(new Point(0, 0), winTest)这个方法返回一个Po ...
- 安装webpack常见错误之一
我安装webpack时,出现如下错误: C:\Users\admin> npm install webpack -gnpm WARN checkPermissions Missing write ...
- Python: pyinstaller打包exe(含file version信息)
最近项目上一直都是用Spyder直接运行.py文件的方式来执行每日的自动化程序,每天都要手动去点击Run来执行一次,所以考虑把.py文件直接打包成exe,然后用windows的task schedul ...
- 在centos7升级jenkins
找到jenkins的位置 使用下面的命令 ps -aux | grep jenkins enkins 5954 7.9 22.5 2695800 421088 ? Ssl 20:5 ...