首页 > 技术文章 > 结构体字节对齐2

kekukele 2014-04-13 23:44 原文

  为了使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字节

推荐阅读