结构体及类对象的内存对齐
https://bbs.pediy.com/thread-222967.htm
环境:VS2015 (x86)
0x01 结构体的内存对齐
先看这个例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #include <Windows.h> #include <iostream> using namespace std; struct Monster { char Tamanonomae; int Shutendouji; char Tengu; }; int main() { Monster MonsterObject; MonsterObject.Tamanonomae = 'A' ; MonsterObject.Shutendouji = 8888; MonsterObject.Tengu = 'B' ; cout << sizeof (Monster) <<endl; return 0; } |
输出的sizeof(Monster)的值为12,来看看结构体MonsterObject的内存:
结构体中的第一个和第三个成员虽然是char类型只占一个字节,但是后面的三个字节都被CC填充了,实际看起来是像int类型一样占了4个字节,所以一共占了12个字节。
换一下结构体中成员的位置:
1 2 3 4 5 6 | struct Monster { char Tamanonomae; char Tengu; int Shutendouji; }; |
输出的sizeof(Monster)的值不再是12了,而是8~,再来看看结构体MonsterObject的内存:
可以发现第一第二个char成员紧紧相邻在一起占了两个字节,但是其后依然填充了两个字节的CC,加上int类型的4字节。所以一共8个字节。
现在,根据实践以及书本博客提及的内存对齐规则,总结了条结构体的内存对齐规则:
1.结构体的每个成员相对于结构体首地址的偏移量都是成员大小的整数倍。
2.结构体的总大小为最结构体最宽基本类型成员的整数倍。
3.结构体的首地址能够被最宽基本类型成员所整除。
0x02 类对象的内存对齐
将上文代码中的struct关键字改为class,再在类中添加public属性:‘
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | #include <Windows.h> #include <iostream> using namespace std; class Monster { public : char Tamanonomae; char Tengu; int Shutendouji; }; int main() { Monster MonsterObject; MonsterObject.Tamanonomae = 'A' ; MonsterObject.Shutendouji = 8888; MonsterObject.Tengu = 'B' ; cout << sizeof (Monster) <<endl; return 0; } |
输出的sizeof(Monster)的值依然是是8,与结构体无异常。
向结构体中添加一个静态成员和一个成员函数:
1 2 3 4 5 6 7 8 9 10 11 12 13 | class Monster { public : char Tamanonomae; char Tengu; int Shutendouji; static int v1; void Function() { printf ( "SHChronic\n" ); } }; |
输出的结果依然是8没有改变,由此可以验证结构体与类对象的区别只是默认访问属性的不同,并且静态数据成员与成员函数不会算入类对象的大小中。对于一个没有父类的的类对象,他的内存模型与结构体相同,也就是内存对齐方式是一样的。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗