博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++类与对象(3) - 空class&struct的大小
阅读量:4071 次
发布时间:2019-05-25

本文共 1882 字,大约阅读时间需要 6 分钟。

目录


C++中,不论是空类,还是空结构体,其大小都是为1。

1.空类大小

一个空类的大小通常为1。

#include
class Empty {};int main(){ std::cout << "sizeof(Empty) = "<

输出结果:

sizeof(Empty) = 1

2.为什么是1

空类大小为1,这样可以确保两个不同的对象,拥有不同的地址。

参考下面这个例子,可以看到两个对象的地址是不同的。

#include
class Empty { };int main(){ Empty a, b; if (&a == &b) std::cout << "address equal, impossible!" << std::endl; else std::cout << "address not equal, excepted!" << std::endl; return 0;}

输出:

address not equal, excepted!

3.空类的指针

同样的原因 (不同对象拥有不同地址),new对象后,也会返回不同的指针。

如下面例子所示:

#include
class Empty{ };int main() { Empty* p1 = new Empty; Empty* p2 = new Empty; if (p1 == p2) std::cout << "address equal, impossible!" << std::endl; else std::cout << "address not equal, excepted!" << std::endl; return 0; }

输出:

address not equal, excepted!

4.空基类的大小

参考下面程序,其中基类是一个空类。

#include
class Empty { };class Derived: Empty { int a; };int main(){ std::cout << "sizeof(Derived) = " << sizeof(Derived); return 0;}

输出:

sizeof(Derived) = 4

注意:输出值并没有预想中的那样会大于4,而是等于4!

这是一条很有趣的规则。即空的基类可以不依靠一个字节来表示。这样编译器碰到空的基类情况时,可以自由的进行优化。

5.各情况下的类大小

#include 
using namespace std;class Empty {};class Derived1 : public Empty {};class Derived2 : virtual public Empty {};class Derived3 : public Empty{ char c;};class Derived4 : virtual public Empty{ char c;};class Dummy{ char c;};int main(){ cout << "sizeof(Empty) " << sizeof(Empty) << endl; cout << "sizeof(Derived1) " << sizeof(Derived1) << endl; cout << "sizeof(Derived2) " << sizeof(Derived2) << endl; cout << "sizeof(Derived3) " << sizeof(Derived3) << endl; cout << "sizeof(Derived4) " << sizeof(Derived4) << endl; cout << "sizeof(Dummy) " << sizeof(Dummy) << endl; return 0;}

输出:

sizeof(Empty) 1
sizeof(Derived1) 1
sizeof(Derived2) 4
sizeof(Derived3) 1
sizeof(Derived4) 8        //这个case包括了内存对齐
sizeof(Dummy) 1
更多参考:

转载地址:http://yqeji.baihongyu.com/

你可能感兴趣的文章
uva-1427 Parade (单调队列优化dp)
查看>>
【设计模式】学习笔记13:组合模式(Composite)
查看>>
hdu 1011 Starship Troopers (树形背包dp)
查看>>
hdu 1561 The more, The Better (树形背包dp)
查看>>
【设计模式】学习笔记14:状态模式(State)
查看>>
poj 1976 A Mini Locomotive (dp 二维01背包)
查看>>
斯坦福大学机器学习——因子分析(Factor analysis)
查看>>
项目导入时报错:The import javax.servlet.http.HttpServletRequest cannot be resolved
查看>>
linux对于没有写权限的文件如何保存退出vim
查看>>
Windows下安装ElasticSearch6.3.1以及ElasticSearch6.3.1的Head插件
查看>>
IntelliJ IDEA 下的svn配置及使用的非常详细的图文总结
查看>>
【IntelliJ IDEA】idea导入项目只显示项目中的文件,不显示项目结构
查看>>
ssh 如何方便的切换到其他节点??
查看>>
JSP中文乱码总结
查看>>
Java-IO-File类
查看>>
Java-IO-java的IO流
查看>>
Java-IO-输入/输出流体系
查看>>
Java实现DES加密解密
查看>>
HTML基础
查看>>
Java IO
查看>>