__attribute__ ((aligned (n), packed))

GNU C扩展的__attribute__ 机制被用来设置函数、变量、类型的属性,其用得较多的是处理字节对齐的问题。


__attribute__ 的语法为:

__attribute__ ((语法列表))


参数aligned(number) [number为最小对齐的字节数]是用得较多的一个。

另一个是参数packed 表示“使用最小对齐”方式,即对变量是字节对齐,对于域是位对齐。


这个例子稍长了点,不过非常简单:

[root@Kendo develop]# cat align.c


#include <stdio.h>

struct A{

  char a;          //1Byte

  int b;           //4B

  unsigned short c;//2B

  long d;          //4B

  unsigned long long e; //8B

  char f;               //1B

};


struct B{

  char a;

  int b;

  unsigned short c;

  long d;

  unsigned long long e;

  char f;

}__attribute__((aligned));


struct C{

  char a;

  int b;

  unsigned short c;

  long d;

  unsigned long long e;

  char f;

}__attribute__((aligned(1)));



struct D{

  char a;

  int b;

  unsigned short c;

  long d;

  unsigned long long e;

  char f;

}__attribute__((aligned(4)));


struct E{

  char a;

  int b;

  unsigned short c;

  long d;

  unsigned long long e;

  char f;

}__attribute__((aligned(8)));


struct F{

  char a;

  int b;

  unsigned short c;

  long d;

  unsigned long long e;

  char f;

}__attribute__((packed));


int main(int argc, char **argv){

  printf("A = %d, B = %d, C = %d, D = %d, E = %d, F = %d\n",

  sizeof(struct A), sizeof(struct B), sizeof(struct C), sizeof(struct D), sizeof(struct E), sizeof(struct F));

  return 0;

}



在一个 32位机 上运行结果如下:


[Copy to clipboard] [ - ]CODE:

[root@Kendo develop]# gcc -o align align.c

[root@Kendo develop]# ./align 

A = 28, B = 32, C = 28, D = 28, E = 32, F = 20

[root@Kendo develop]#


我们看到


最后一个struct F,1 + 4 + 2 + 4 + 8 + 1 = 20,因为使用了__attribute__((packed)); 

来表示以最小方式对齐,所以结果刚好为20。


而第一个struct A,因为什么也没有跟,采用默认处理方式:4(1) + 4 + 4(2) + 4 + 8 + 4(1) = 28,括号中是其成员本来的大小。与此相似的是struct D。


接下来看struct E,采用8个字节的方式来对齐:8(1+4+2 ,即a, b, c)+ 8(4, d) + 8 + 8(1, f) = 32。


而在struct C中,试图使用__attribute__((aligned(1))) 来使用1个字节方式的对齐,不过并未如愿,仍然采用了默认4个字节的对齐方式。


在struct B中,aligned没有参数,表示“让编译器根据目标机制采用最大最有益的方式对齐"――当然,最有益应该是运行效率最高吧,呵呵。其结果是与struct E相同。


转载出处:http://blog.chinaunix.net/uid-21830881-id-1813965.html

你可能感兴趣的:(__attribute__,((aligned,(n),packed)))