C/C++ 结构体内存分布
参考文章:C++中的结构体所占内存空间总结 - fengMisaka - 博客园 (cnblogs.com)
在C C++中,一般情况下。struct 的 sizeof 是所有成员字节对齐后长度相加,而 union 的 sizeof 是取最大的成员长度,再相加。
字节对齐的细节和编译器实现相关,但一般而言,满足以下3个准则:
(1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除。
(2) 结构体每个成员相对于结构体首地址的偏移量(offset)都是当前成员大小的整数倍,如有需要编译器会在成员之间加上填充字节。
(3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节。
需要注意的是,基本类型是指前面提到的像 char、short、int、float、double 这样的内置数据类型。如果一个结构体中包含另外一个结构体成员,那么此时最宽基本类型成员不是该结构体成员,而是取基本类型的最宽值。
(均以32位机为例,Int型4字节,long 4字节,long long 8字节。其实4字节还是8字节不止和平台有关,编译器也会影响)
几种可能的情况:
1.全部为同一种基础类型:
typedef struct { char ch1; char ch2; char ch3; } //成员均为1,不用补齐,总大小为3
2.有不止一种基础类型
typedef struct { int num; //占用4 字节 char b; //占用1字节,补齐到4字节 } //总共8字节
typedef struct { char a; //占用1字节,补齐到4字节 int b; //占用4字节 long long c; //占用8字节 char d; //1字节,但要补齐到c的倍数,即总共24字节 }
32位机指针大小4字节
typedef struct { long num; //4 char *num; //8 short int data; //10 char d; //11字节,但需要补齐到4的倍数,共12字节 }
3. 使用了#pragma pack(n)指令
这个指令会强制要求编译器放弃字节对齐,而是要求按照n个字节对齐。但如果大于所有成员的长度,n不会起作用
#pragma pack(1) typedef struct { char a; //1 int b; //占用2-5 int c; //占用6-9 } //总共占用9字节
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)