5-5结构体的对齐访问

本文详细介绍了结构体的对齐访问原理,包括为什么要进行对齐访问以提高效率,以及结构体对齐的规则和运算。讨论了gcc中两种对齐指令#pragma pack()和attribute((packed/aligned(n)))的使用及其区别,并提醒了在gcc中使用#pragma pack()的不推荐性。

5.5.1 举例说明什么是结构体对齐访问

(1)上一节讲过结构体中元素的访问其实本质上还是用指针方式,结合这个元素在整个结构体中的偏移量和这个元素的类型来进行访问的。
(2)但是实际上结构体的元素的偏移量比我们上一节讲的还要复杂,因为结构体要考虑元素的对齐访问,所以每个元素实际占的字节数和自己本身的类型所占的字节数不一定完全一样。(譬如char c实际占字节数可能是1,也可以是2,也可能是3,也可能是4)
(3)一般来说,我们用.的方式来访问结构体元素时,我们是不用考虑结构体的元素对齐的。因为编译器会帮我们处理这个细节。但是因为C语言本身是很底层的语言,而且做嵌入式开发经常需要从内存角度,以指针方式来处理结构体及其中的元素,因此还是需要掌握结构体对齐规则。

#include <stdio.h> 
struct s
{
   
   	
	char c;		//c实际占4个字节,而不是1个字节	
	int b;
};
int main(void)
{
   
   	
	struct s s1;	
	s1.c = 't';	
	s1.b = 12;		
	char *p1 = (char *)(&s1);	
	printf("*p1 = %c\n",*p1);		
	printf("&s1 = %p\n",&s1);//&s1 = 0x7ffefae2b490	
	printf("&s1.b =  %p\n",&s1.b);
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

非主流的豆瓣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值