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);

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

被折叠的 条评论
为什么被折叠?



