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内容的详解来看本文. 方法 ...
随机推荐
- Go语言的传参和传引用[转]
目录[-] 传参和传引用的问题 传slice不是传引用! 什么叫传引用? 为什么传slice不是传引用? 为什么很多人误以为slice是传引用呢? 传指针和传引用是等价的吗? 所有类型的函数参数都是传 ...
- iPhone 物理尺寸与分辨率
// iPhone 物理尺寸(pt:Point) 分辨率(px) // 4S 320*480(3.5英寸) 640*960 // 5,5c,5S 32 ...
- PhotoModeler Scanner教程
Marking and Referencing 标记和校正 标记和校正是通过多张照片人工匹配共同特征的过程.点击一张图片的明显视觉特征,然后将它匹配到不同角度拍摄的其他图片的相同特征上. Approp ...
- ScrollView嵌套listview ,滚动问题。设置listview不滚动
对于ListView内部的ListView,一般用来展示少量的列表数据. 内部的ListView的高度看起来是一个固定值且无法滑动,这个就比较蛋疼了.. 提供两种解决方案,方案的核心都是重新设置内部L ...
- 《Python3网络爬虫开发实战》PDF+源代码+《精通Python爬虫框架Scrapy》中英文PDF源代码
下载:https://pan.baidu.com/s/1oejHek3Vmu0ZYvp4w9ZLsw <Python 3网络爬虫开发实战>中文PDF+源代码 下载:https://pan. ...
- Spring 配置 事务的几种方式
Spring配置文件中关于事务配置总是由三个组成部分,DataSource.TransactionManager和代理机制这三部分,无论是那种配置方法,一般变化的只是代理机制这块! 首先我创建了两个类 ...
- Create a site by Google Site - All Free
Follow this link : https://www.google.com/sites/help/intl/en/overview.html
- Ubuntu/Debian下通过Apt-get简单安装Oracle JDK
近几年本人对各种Arm小板,开发板不明原因中毒,基本以Linux系统为主,本篇文章以记录在32位Arm的Debian8上,通过Apt-get的简单命令安装Oracle JDK8并成功的记录. 1.首先 ...
- Tomcat的error-page掩盖action实例化的exception
在使用Struts2+Spring+Tomcat开发的时候,为了避免骚扰用户,线上系统我们一般会定义错误处理页面.但是如果开发环境中也这么做(在web.xml定义了错误转发页面),而碰巧某个actio ...
- vux组件简单使用请大佬指点
一.打开vux项目 我用的是vsCode工具自己找看个人选择,第一次使用请去找vc方便开发使用的插件 二.项目目录及文件,有遮挡部分自行查看文件 三.根据官方文档实现引入插件 通过vux-loader ...