1 预备知识
1.1 变量所占内存
(1)32位操作系统:
char : 1 int :4 short : 2 unsigned int : 4 long : 4 unsigned long : 4 long long : 8 float : 4 double : 8 指针 : 4
(2)64位操作系统
char : 1 int :4 short : 2 unsigned int : 4 long : 8 unsigned long : 8 long long : 8 float : 4 double : 8 指针 : 8
1.2 内存对齐
例1:
int main(void){
char a;
int b;
int c;
printf("a=%d\n",&a);
printf("b=%d\n",&b);
printf("c=%d\n",&c);
}
分析:char 所占1字节,int 所占4字节,假设起始内存为00000,那么a的起始地址为00000,b的起始地址00001,c的起始地址00005,总体所占内存大小为9字节。

通过编译(64b),可以看到a 的起始地址为6487583,b 的起始地址为6487576,c的起始地址为6487572,所占内存大小与分析不符。
原因:CPU每次都是以8字节(64b)或4字节(32b)的整数倍的内存地址中读取数据,如果不以整数倍读取,访问变量时,CPU需要进行多次访问内存操作,增加开销,即内存对齐。
内存对齐:编译器为了优化代码、往往

本文介绍了C语言中结构体所占内存的计算原理,包括变量在不同操作系统下的内存占用,以及内存对齐的概念和规则。通过对实例的分析,揭示了结构体成员按照各自对齐字节数和最大成员对齐方式排列,并且结构体长度必须是最大对齐参数的整数倍的内存对齐原则。
最低0.47元/天 解锁文章
2669





