「C/C++ 01」计算结构体/类的大小和内存对齐

目录

一、计算结构体的大小

二、计算类的大小

三、内存对齐 


一、计算结构体的大小

        计算结构体的大小要遵循内存对齐规则:即从第二个成员变量开始,起始位置要计算,在自己的大小和默认对齐数(VS编译器中默认对齐数为8)中选择较小的那个,起始位置为其倍数。最后整个结构体也必须要对齐:结构体的大小必须是默认对齐数的整数倍。

二、计算类的大小

1.计算成员变量的大小

        类和结构体的一样,也遵守内存对齐规则,从第二个成员变量开始,起始位置要计算,在自己的大小和默认对齐数(VS编译器中默认对齐数为8)中选择较小的那个,起始位置为其倍数。最后整个类也必须要对齐:类的大小必须是默认对齐数的整数倍。

        当sizeof计算类的大小的时候会忽略静态成员变量的大小。


2.计算成员函数的大小

        算类的大小时,不用考虑成员函数,故不用加上函数指针的大小。


3.计算空类的大小

        注意,没有成员变量的类(包括空类)的大小为1字节,不存储数据,目的是为了占位,标识对象存在,区分不同的对象。


总结:

        计算类的大小就是按照内存对齐的方式计算类中所有(非静态)成员变量 的大小。

三、内存对齐 

        在编程中,内存对齐是一种提高内存访问效率的方法。简单来说,内存对齐就是将数据存储在特定的地址,这个地址是某个特定数值(对齐数)的整数倍。这样做的好处是可以提高CPU的内存访问效率,因为CPU访问内存时是按块进行的,如果数据没有对齐,CPU就需要多次访问内存才能获取到完整的数据,而如果数据对齐,CPU就可以一次访问就获取到完整的数据。

        在C++中,类和结构体也会遵守内存对齐规则。每个成员变量在内存中的位置都会从其上一个成员变量结束后起始位置的某个倍数开始。这个起始位置的计算方式是:取默认对齐数(在VS编译器中默认对齐数为8)和自己的大小中的较小值,然后选择这个数的整数倍作为起始位置。

        同时,整个类的大小也必须是对齐数的整数倍。这是因为如果类的大小不是对齐数的整数倍,那么在访问这个类的对象时,CPU就可能需要多次访问内存才能获取到完整的数据。

这种内存对齐的方式可以提高CPU的内存访问效率,但是它也会导致一定的内存浪费。因为即使有些成员变量之间有空隙,这些空隙也不能被利用。所以,内存对齐是一个权衡内存使用效率和内存访问效率的问题。


------------------------END-------------------------

才疏学浅,谬误难免,欢迎各位批评指正。

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

烛火萤辉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值