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内容的详解来看本文. 方法 ...
随机推荐
- [译]Autoprefixer:一个以最好的方式处理浏览器前缀的后处理程序
Autoprefixer解析CSS文件并且添加浏览器前缀到CSS规则里,使用Can I Use的数据来决定哪些前缀是需要的. 所有你需要做的就是把它添加到你的资源构建工具(例如 Grunt)并且可 ...
- 【翻译】JavaScript框架的最终指南
翻译原文链接 我的翻译小站 紧跟JavaScript框架的脚步是一个挑战.现在有太多的框架,几乎一个月就会出来一个新的.那么如何知道到底哪一个比较合适你的项目呢?它们分别有什么优点和缺点呢?你要如何开 ...
- day13(反射,BeanUtils包)
反射, 获取字节码文件的方式: 方式一: 对象.getClass(); 方式二: 类名.Class; 方式三: Class.forName(String Class); 通过字节码文件获取对象 定 ...
- (最小生成树 )还是畅通工程 -- HDU--1233
链接: http://acm.hdu.edu.cn/showproblem.php?pid=1233 http://acm.hust.edu.cn/vjudge/contest/view.action ...
- java基础-day5
第05天 java基础知识 今日内容介绍 u 方法的概述及基本使用 u 方法的练习及注意事项 u 方法的重载及参数传递 u 方法的操作数组的练习 第1章 方法的概述及基本使用 1.1 方法定义格 ...
- PAT甲 1011. World Cup Betting (20) 2016-09-09 23:06 18人阅读 评论(0) 收藏
1011. World Cup Betting (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Wit ...
- 四则运算 Python实现(杨浩政,张兆敏)
四则运算 GitHub仓库:https://github.com/15crmor/Arithmetic 项目要求: 题目:实现一个自动生成小学四则运算题目的命令行程序说明: 说明: 自然数:0, 1, ...
- 基于注解方式@AspectJ的AOP
启用对@AspectJ的支持 Spring默认不支持@AspectJ风格的切面声明,为了支持需要使用如下配置: <aop:aspectj-autoproxy/> 这样Spring就能发现@ ...
- (原创)PetaPoco使用小记(2014-5-5更新)
接触PetaPoco已经有一段时间了,为了全面了解一下PetaPoco,刚好结合目前在做的一个项目,对常用的几个业务操作用PetaPoco进行改写,如增删改查.分页以及存储过程的调用,在文章的最后附上 ...
- django分页及搜索后如何翻页
django自带了Pagnator 导入 from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage 分页 def ...