C++之字节对齐
参考:https://blog.csdn.net/hello_dear_you/article/details/123739899
#define _CRT_SECURE_NO_WARNINGS // #pragma pack(1) #include <iostream> using namespace std; class Person{ public: int m_A; // 非静态的成员变量,属于对象身上 void func(){} // 非静态成员函数,不属于对象 static int m_B ; // 静态成员属性,也不属于对象 static void func1(){} // 静态的成员函数,也不属于对象 double m_C; // double类型 8个字节 }; void test01(){ cout << "Size of Person:" <<sizeof(Person)<<endl; // 输出 16 原因是字节对齐 // 空类的大小为1 每一个对象在内存中都有一个唯一的地址 char来维护这个地址 // char的大小就是1 } int main(){ test01(); return 1; }
运行结果: Size of Person: 16
为什么要进行字节对齐?
答:以牺牲空间的方式来减少时间的消耗。
结构体对齐的公式
- 以
#pragma pack(x)
中x
和结构体中占用空间最大的成员做比较,取两者的最小值为n
- 以
n
值与结构体每个成员比较,得出结果列表为`m[x]`` - 根据每个成员的大小依次向内存中填充数据,要求填充成员的起始地址减去结构体起始地址的差值可以整除
m[x]
,如不能整除则向后移动,直到可以整除再填充成员到内存中 - 当全部成员填充完毕后所占用的字节数若不能整除
n
,则扩充内存至可以整除n
为止
#pragma pack(4)// 编译器将按照n个字节对齐 struct data { int a; // 4 bytes char b; // 4 bytes int c; // 4 bytes short d; // 4bytes }; // 16 bytes #pragma pack() // 编译器将取消自定义字节对齐方式
字节对齐看这篇就够了:https://cloud.tencent.com/developer/article/1631792
嵌套结构体字节对齐:https://www.cnblogs.com/yichi/p/9478004.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· .NET Core 中如何实现缓存的预热?
· 三行代码完成国际化适配,妙~啊~
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?