zoukankan      html  css  js  c++  java
  • __attribute__系列之介绍篇

    1.什么是__attribute__?

        __attribute__机制是GNU C的一大特色,它可以设置函数属性变量属性类型属性等。可以通过它们向编译器提供更多数据,帮助编译器执行优化等。

    2.__attribute__语法格式?

    https://gcc.gnu.org/onlinedocs/gcc-4.0.0/gcc/Attribute-Syntax.html#Attribute-Syntax

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

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

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

      An attribute specifier is of the form __attribute__ ((attribute-list)). An attribute list is a possibly empty comma-separated sequence of attributes, where each attribute is one of the following:

    • Empty. Empty attributes are ignored.
    • A word (which may be an identifier such as unused, or a reserved word such as const).
    • A word, followed by, in parentheses, parameters for the attribute. These parameters take one of the following forms:
      • An identifier. For example, mode attributes use this form.
      • An identifier followed by a comma and a non-empty comma-separated list of expressions. For example, format attributes use this form.
      • A possibly empty comma-separated list of expressions. For example, format_arg attributes use this form with the list being a single integer constant expression, and alias attributes use this form with the list being a single string constant.

    3.函数属性:

    https://gcc.gnu.org/onlinedocs/gcc-4.0.0/gcc/Function-Attributes.html#Function-Attributes

    __attribute__ format

    __attribute__ noreturn

    __attribute__ const

    4.变量属性:

    https://gcc.gnu.org/onlinedocs/gcc-4.0.0/gcc/Variable-Attributes.html#Variable-Attributes

    aligned (alignment)

    This attribute specifies a minimum alignment for the variable or structure field, measured in bytes. For example, the declaration:

    int x __attribute__ ((aligned (16))) = 0;

    causes the compiler to allocate the global variable x on a 16-byte boundary. 

    设置指定大小的对齐格式

    You can also specify the alignment of structure fields. For example, to create a double-word aligned int pair, you could write:

    struct foo { int x[2] __attribute__ ((aligned (8))); };

    This is an alternative to creating a union with a double member that forces the union to be double-word aligned.

    As in the preceding examples, you can explicitly specify the alignment (in bytes) that you wish the compiler to use for a given variable or structure field. Alternatively, you can leave out the alignment factor and just ask the compiler to align a variable or field to the maximum useful alignment for the target machine you are compiling for. For example, you could write:

              short array[3] __attribute__ ((aligned));
         

    Whenever you leave out the alignment factor in an aligned attribute specification, the compiler automatically sets the alignment for the declared variable or field to the largest alignment which is ever used for any data type on the target machine you are compiling for. Doing this can often make copy operations more efficient, because the compiler can use whatever instructions copy the biggest chunks of memory when performing copies to or from the variables or fields that you have aligned this way.

    The aligned attribute can only increase the alignment; but you can decrease it by specifying packed as well. See below.

    Note that the effectiveness of aligned attributes may be limited by inherent limitations in your linker. On many systems, the linker is only able to arrange for variables to be aligned up to a certain maximum alignment. (For some linkers, the maximum supported alignment may be very very small.) If your linker is only able to align variables up to a maximum of 8 byte alignment, then specifying aligned(16) in an __attribute__ will still only provide you with 8 byte alignment. See your linker documentation for further information. 

    cleanup (cleanup_function)

    The cleanup attribute runs a function when the variable goes out of scope. This attribute can only be applied to auto function scope variables; it may not be applied to parameters or variables with static storage duration. The function must take one parameter, a pointer to a type compatible with the variable. The return value of the function (if any) is ignored.

    If -fexceptions is enabled, then cleanup_function will be run during the stack unwinding that happens during the processing of the exception. Note that the cleanupattribute does not allow the exception to be caught, only to perform an action. It is undefined what happens if cleanup_function does not return normally.

    packed

    5.类型属性:

    https://gcc.gnu.org/onlinedocs/gcc-4.0.0/gcc/Type-Attributes.html#Type-Attributes

  • 相关阅读:
    .Net core 上传文件
    Vue--判断用户首次进入页面还是刷新页面?
    博学笃志,切问近思,此八字,是收放心的工夫。 神闲气静,智深勇沉,此八字,是干大事的本领。
    用javascript替换URL中的参数值
    ASP.Net Core SignalR
    Android菜鸡脉脉求助:4年开发经验,深圳不到15K,我该怎么办?
    Android性能优化
    新手避坑指南:Android组件化开发详解
    Android开发,没有跟上跨平台技术发展是你职业规划最大的可悲
    字节跳动面试官:一张图片占据的内存大小是如何计算
  • 原文地址:https://www.cnblogs.com/black-mamba/p/6786383.html
Copyright © 2011-2022 走看看