结构体字节对齐2

  为了使CPU访问数据更加高效,编译器在编译程序时会自动进行对齐操作(GCC默认4字节对齐,windows VC默认8字节对齐),所谓对齐即让数据的首地址是数据长度的整数倍,如int 的长度是4 ,则其首地址应该能被4整除。

  在程序编写的时候,若要强制数据结构对齐,有两种方式,一种方式是使用#pragma pack(n)规定对齐的大小,然后再用#pragma pack()恢复默认编译器字节对齐;一种方式是使用__attribute__((aligned(n))),但两者之间存在一定的区别。

  关于结构体字节对齐的详细介绍请读者到http://www.cnblogs.com/dolphin0520/archive/2011/09/17/2179466.html阅读。本文只在这里做两种自定义对齐的区别分析。

#pragma pack(n)

首先上代码

#include <stdio.h>
#pragma pack(4) //设置4字节对齐
struct test_struc{
   char a;
   short b;
   char c;
};
#pragma pack() //恢复编译器默认对齐
int main(void){
   printf("size of test_struc:%d\n", sizeof(struct test_struc));
}

运行结果

# ./test
size of test_struc:6

 结果分析:

 结构体test_struc中最长元素占长度为sizeof(short)=2 字节,

而#pragma pack(4)设置的4字节对齐,两者取较小者,所以结构体按2字节对齐,
char a ------------2字节
short b -----------2字节
char c ------------2字节

__attribute__((aligned(n)))

上代码

#include <stdio.h>
struct test_struc{
   char a;
   short b;
   char c;
}__attribute__((aligned(4)));
int main(void){
   printf("size of test_struc:%d\n", sizeof(struct test_struc));
}

运行结果:

#./test
size of test_struc:8

 结果分析:

 __attribute__((aligned(4)))是强制4字节对齐,不管结构体本身元素的最大大小是多少,结构体总体大小必须是 4的整数倍

char a --------------2字节

short b -------------2字节

char c ---------------4字节

转载于:https://www.cnblogs.com/kekukele/p/3663020.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值