上篇文章中介绍了 __attribute__ mechanism Function Attribute 参考链接:http://www.cnblogs.com/respawn/archive/2012/07/09/2582548.html
我不喜欢对自己写的文章做过多的修饰,所以很不注重排版,喜欢走简约路线. 所以如果您认为我的博文排版很差而忽略文章内容的话,那么我
只能说我注重技术,不注重次要的浪费时间的无价值动作. 如果您可以对我的博文进行批评指正的话,那我这里谢过了.技术嘛,需要多讨论,多
研究,不是写出来给别人赞扬的.(上述仅代表我个人观点,如果您不喜欢,请原谅.)
下午有事出去了,直到刚才才回宿舍洗完澡,现在听着音乐,静下心来继续未完成的工作.
在之前的文章中,我给出了很多的实例操作. 在这篇文章中我就不再给出实例了,因为方法都已经很明确了.大家可以自己尝试,若有一两个的确需要给出实例
的,我会给出参考实例的.
一、 Variable Attribute
1. __attribute__((alias)) : 在之前的文章中有说过对于函数的限定,在这里是对变量的限定,用法很相似:
type newname __attribute__((alias("oldname")));
其中的newname和oldname都不需要再解释了,和前面的文章中说的一样. 在使用的时候对于newname的操作,就是对oldname的操作.
2. __attribute__((aligned(ALIGNMENT))): 指定变量或结构体最小字节对齐数,以byte为单位.
ALIGNMENT: 指定的字节对齐操作数.
其他的就不多说了,因为关于字节对齐这部分的内容如果需要说明白,可以单独写一篇博文了,考虑一下,有时间我回补充这一节,单独写一篇.
3.__attribute__((cleanup(cleanup_function)): 当一个变量的作用域消失时,便会执行后面的clean_function函数.
如何去理解这一点呢? 就好像是C++中的智能指针一样,当离开它的作用域的时候就会被销毁.通过使用 __attribute mechiansm cleanup属性也可以做
到.
4.__attribute__((deprecated(MSG))): 注明这是一个被弃用的变量,前面说到的是弃用的函数.
MSG: 输出的信息.
如果被弃用的变量在其他的地方被使用了,那么编译器就会输出warnning.但是编译还是会通过. warnning的信息中包括有弃用变量被使用的未知,通常是
指在某个文件中某行这类的信息.
使用方法和弃用函数的方法一样.
5. __attribute__((section("section-name"))): 这个是我在前文中说过的.
6. __attribute__((packed)): 使变量或者是结构体按照最小的对齐方式,对于变量是1byte对齐,对于字段,也就是field指bit对齐.
这个会放到后面和前面的aligned一起作为字节对齐的讨论内容.
7.__attribute__((weak)) : 这个很搞了,官网上的手册只是丢了一个链接 那就是去参考Function Attribute中weak attribute的用法.所以我也就不多说什么了.
二、Type Attribute
1.__attribute__((aligned(ALIGNMENT))) : 字节对齐,和前面的用法差不多,注意使用aligned attribute使变量或者是结构做字节对齐的时候,对齐后只会增大或者不变.
struct S { short f[3]; } __attribute__((aligned(8))); typedef int more_aligned_int __attribute__((aligned(8)));
如上面所示, struct S 指定了对齐的方式是8byte. f[3]总共是6byte.而由于指定了字节对齐操作数是8,所以整个S结构体就是8byte.
2.__attribute__((packed)): 前面已经介绍过了 packed attribute. 和前面的aligned不同的是,packed采用的是紧凑型的字节对齐方式,所以最后是会按照最小对齐方式执行.
struct unpacked_struct { char c; int i; }; struct __attribute__(( packed )) packed_struct { char c; int i; struct unpacked_struct us; };
在上面的示例代码中,我们可以看到,在指定了packed对齐方式的struct packed_struct中有一个没有指定对齐方式的struct unpacked_struct对象。
尽管我们对结构体packed_struct进行了packed方式的对齐,但是不能对其成员us进行指定字节对齐. 这点是需要注意的,所以如果需要对packed_struct结构进行packed完全紧凑对齐,
则需要对unpacked_struct进行packed方式紧凑对齐.
OK,把上午剩下的任务补上了...