• GNU C Using GNU GCC __attribute__ mechanism 02 Variable Attribute && Type Attribute


    上篇文章中介绍了 __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,把上午剩下的任务补上了...

     

     

     

     

     
  • 相关阅读:
    ts 问号点 ?.
    moment获取本月、上个月、近三个月时间段
    iframe优缺点
    Git问题解决方案:不建议在没有为偏离分支指定合并策略时执行pull操作(Pulling without specifying how to reconcile divergent branches)
    Mac上git自动补全功能
    webstorm 使用积累
    什么是EPG?
    chrome浏览器devtools切换主题(亮色,暗色)
    python—requests的基本使用
    Chrome Devtool Performance
  • 原文地址:https://www.cnblogs.com/respawn/p/2583651.html
Copyright © 2020-2023  润新知