__attribute__ __attribute__ 用法

1.__attribute__ 机制

GNU C 的一大特色就是__attribute__ 机制。__attribute__ 可以设置函数属性(Function Attribute )、变量属性(Variable Attribute )和类型属性(Type Attribute )。

__attribute__ 书写特征是:__attribute__前后都有两个下划线,并切后面会紧跟一对原括弧,括弧里面是相应的__attribute__ 参数。

__attribute__ 语法格式为:__attribute__ ((attribute-list))

其位置约束为:放于声明的尾部“ ;”之前。

我们只讨论类型属性。其他信息参考如下:

http://blog.chinaunix.net/u1/59740/showart_482955.html

http://www.unixwiz.net/techtips/gnu-c-attributes.html

http://gcc.gnu.org

2.类型属性

关键字__attribute__ 也可以对结构体(struct )或共用体(union )进行属性设置。大致有六个参数值可以被设定,即:aligned, packed, transparent_union,unused, deprecated 和 may_alias 。

在使用__attribute__参数时,你也可以在参数的前后都加上“__”(两个下划线),例如,使用__aligned__而不是aligned,这样,你就可以在相应的头文件里使用它而不用关心头文件里是否有重名的宏定义。

2.1. aligned(alignment)

该属性设定一个指定大小的对齐格式(以字节 为单位),例如:

struct S {

shortb[3];

} __attribute__ ((aligned (8)));

typedef int int32_t __attribute__ ((aligned(8)));

该声明将强制编译器确保(尽它所能)变量类 型为struct S 或者int32_t 的变量在分配空间时采用8 字节对齐方式。

如上所述,你可以手动指定对齐的格式,同样,你也可以使用默认的对齐方式。如果aligned后面不紧跟一个指定的数字值,那么编译器将依据你的目标机器情况使用最大最有益的对齐方式。例如:

struct S {

shortb[3];

} __attribute__ ((aligned));

这里,如果sizeof (short )的大小为2 (byte),那么,S 的大小就为6 。取一个2 的次方值,使得该值大于等于6 ,则该值为8,所以编译器将设置S类型的对齐方式为8 字节。

aligned 属性使被设置的对象占用更多的空间,相反的,使用packed 可以减小对象占用的空间。

需要注意的是,attribute 属性的效力与你的连接器也有关,如果你的连接器最大只支持16 字节对齐,那么你此时定义32 字节对齐也是无济于事的。

2.2.packed

使用该属性对struct 或者union 类型进行定义,设定其类型的每一个变量的内存约束。当用在enum 类型 定义时,暗示了应该使用最小完整的类型(it indicates that the smallest integraltype should be used )。

下面的例子中,packed_struct类型的变量数组中的值将会紧紧的靠在一起,但内部的成员变量s 不会被“pack” ,如果希望内部的成员变量也被packed 的话,unpacked-struct 也需要使用packed 进行相应的约束。

struct unpacked_struct

{

char c;

int i;

};

struct packed_struct

{

char c;

int i;

struct unpacked_struct s;

}__attribute__ ((__packed__));

2.3.变量属性与类型属性举例

下面的例子中使用__attribute__属性定义了一些结构体及其变量,并给出了输出结果和对结果的分析。

程序代 码为:

struct p

{

int a;

char b;

short c;

}__attribute__((aligned(4))) pp;

struct m

{

char a;

int b;

short c;

}__attribute__((aligned(4))) mm;

struct o

{

int a;

char b;

short c;

}oo;

struct x

{

int a;

char b;

struct p px;

short c;

}__attribute__((aligned(8))) xx;

int main()

{

printf("sizeof(int)=%d,sizeof(short)=%d.sizeof(char)=%dn",sizeof(int),sizeof(short),sizeof(char));

printf("pp=%d,mm=%d n", sizeof(pp),sizeof(mm));

printf("oo=%d,xx=%d n", sizeof(oo),sizeof(xx));

return 0;

}

输出结 果:

sizeof(int)=4,sizeof(short)=2.sizeof(char)=1

pp=8,mm=12

oo=8,xx=24

分析:

sizeof(pp):

sizeof(a)+sizeof(b)+sizeof(c)=4+1+1=6<8所以sizeof(pp)=8

sizeof(mm):

sizeof(a)+sizeof(b)+sizeof(c)=1+4+2=7

但是a 后面需要用 3 个字节填充,但是b 是 4 个字节,所以a 占用 4 字节,b 占用 4 个字节,而c 又要占用 4 个字节。所以sizeof(mm)=12

sizeof(oo):

sizeof(a)+sizeof(b)+sizeof(c)=4+1+2=7

因为默 认是以4 字节对齐,所以sizeof(oo)=8

sizeof(xx):

sizeof(a)+ sizeof(b)=4+1=5

sizeof(pp)=8; 即xx 是采用8字节对齐的,所以要在a ,b 后面添3 个空余字节,然后才能存储px ,

4+1+ (3 )+8+1=17

因为xx 采用的对齐是8 字节对齐,所以xx 的大小必定是8 的整数倍,即xx 的大小是一个比17 大又是8的倍数的一个最小值,由此得到

17<24 ,所以sizeof(xx)=24

__attribute__ __attribute__ 用法

  

爱华网本文地址 » http://www.413yy.cn/a/25101016/286286.html

更多阅读

的地得的用法 的和地的区别及用法

的地得的用法——简介日常工作中,常会有人提到“的”“地”“得”用法的问题,不少学生对“的、地、得”用法也是含糊不清,乱用一气,作业自然会在“的”“地”“得”用法上出错,并且屡改屡犯。大家都知道,“的”、“地”、“得”这三个字的

眼线膏的用法画出迷人眼线 美宝莲眼线膏

眼线膏的用法画出迷人眼线——简介美眉们一般都习惯用眼线笔来画眼线,今天小编要在这里教大家如何用眼线膏来描画眼线,步骤很简单,想要画好眼妆的美眉们,赶紧准备好工具,跟小编一起来学习吧!眼线膏的用法画出迷人眼线——工具/原料

睫毛膏的正确用法 睫毛膏如何使用

  睫毛膏对于很多女孩子来说其实并不陌生,但是大家真的知道睫毛膏的正确用法吗,如何使用睫毛膏才能让自己的睫毛更翘、更卷,而且看起来不会显得很僵硬呢,如果你还不懂那就来一起学习一下睫毛膏的正确用法吧。睫毛膏的正确用法——工

财务凭证装订机用法 财务凭证装订机维修

财务凭证装订机用法——简介热熔管财务装订机它不仅装订速度快为我们大大的节约时间、而且没有噪音、无污染,下面看具体操作步骤:财务凭证装订机用法——热熔管财务装订机操作步骤:财务凭证装订机用法 1、接通电源后,插入装订管财务凭

护发素的用法 护发素发膜的正确用法

护发素的用法——简介护发素可以为头发提供一层保护,或许就因此得名了吧。比起洗发用品,护发素能够令头发看起来更自然和健康。 下面来介绍一下护发素的用法供参考。 护发素的用法——工具/原料护发素护发素的用法——方法/步骤护发

声明:《__attribute__ __attribute__ 用法》为网友黑色指针分享!如侵犯到您的合法权益请联系我们删除