C语言之内存对齐(一)

本文通过实例分析C语言结构体在内存对齐的原则,探讨gcc编译器下的内存布局,解释为何结构体变量大小并非简单相加,并讨论不同成员顺序对内存占用的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天面试遇到内存对齐的问题,之前也遇到过没做总结,今天很侥幸地过了,在此做一个简单的总结:

1.关于什么是内存对齐以及为什么要内存对齐,网上一大堆,我就不抄了,我写几个实例分析一下:

2.在linux 平台下,以C语言的结构体为例:

1)struct member

{

char num;

short grade;

int total;

};

通过上述结构体定义一个变量,该变量在内存中的大小为8个字节(32位机器)

gcc编译器默认的是4字节对齐,在第一个结构体中,成员类型是char short int,char在内存中占1个字节,short占2个字节,int占4个字节,故对于第一个结构体变量的大小很多人都以为是7个字节,没有考虑内存对齐的问题。

结构体的起始地址是第一个成员的起始地址,char变量可以放在任意的位置,因为它在内存中只占一个字节,short变量占两个字节,故它的起始地址应该是2的倍数,故我们需要在第一个char后面留一个字节的空,让short变量的内存能与之前的内存保持对齐,最后一个int成员,int占4个字节,而前面的char 和short 成员刚好占了4个字节,与最后一个成员的内存能够保持对齐。

2)struct member

{

short grade;

int total;

char num;

};

通过上述结构体定义一个变量,该变量在内存中的大小为12个字节(32位机器)

在这个结构体中,结构体起始大小是2个字节,需要与后面的int 保持一致,故需要留出两个空格,最后一个是char 变量,本身只占一个字节,但是gcc默认是4个字节对齐,故需要留出三个空格,保证内存对齐。

3)struct member

{

int total;

char num;

short grade;

};

通过上述结构体定义一个变量,该变量在内存中的大小为8个字节(32位机器)

在上述结构体中,第一个成员是int 占4个字节本身就是对齐的,第二个成员char 需要与后面的short保持对齐故需要添加一个空格,第三个成员short占两个字节与之前的两个字节共占了4个字节,保证了内存对齐,不需要进行额外处理。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值