C/C++中结构体struct占用内存大小的计算方法
两个值:
- 对齐系数:一般为8个字节。
#pragma pack(8)
设置对齐系数为8。 - 有效对齐值:假设结构体中最长的类型的长度为len,则
有效对齐值=min(len,对齐系数)
。
计算规则:
- 计算存放的位置:第一个成员放在位置0,后面的成员A存放的时候,会先计算size=min(A大小, 有效对齐值),A只放在size的整数倍的位置。
- 结构体作为成员:size大小为结构体成员的有效对齐值。
- 结构体的总大小,必须是其有效对齐值的整数倍,不足的要补齐。
内存对齐的目的是为了内存对齐,减少访存操作。
#include <stdio.h>
#pragma pack(8)
int main()
{
struct Test
{
int a;
//long double大小为16bytes
long double b;
char c[10];
};
printf("%d", sizeof(Test)); // 8+8+8+10=34 34不是8的倍数,所以为40
return 0;
}
#include <stdio.h>
#pragma pack(16)
int main()
{
struct Test
{
int a;
//long double大小为16bytes
long double b;
char c[10];
};
printf("%d", sizeof(Test)); // 16+16+10=42 42不是16的倍数,所以为48
return 0;
}
#include <stdio.h>
int main()
{
struct b
{
double y;
char x;
};
struct a
{
int c;
char x;
b b1;
};
printf("%d", sizeof(a)); // 4+4+8+1 = 17 --> 24
return 0;
}
#include <stdio.h>
int main()
{
typedef struct a
{
int c;
double d;
char b[10];
}test;
test e;
printf("%d", sizeof(test)); // 32
return 0;
}
#include <stdio.h>
int main()
{
typedef struct a
{
double d;
int c;
char b[10];
}test;
test e;
printf("%d", sizeof(test)); // 24
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?