C++ : __attribute__

转载 2017年04月04日 10:27:08

GCC使用__attribute__关键字来描述函数,变量和数据类型的属性,用于编译器对源代码的优化。

描述函数属性的几个重要的关键字:

void noreturnfun() __attribute__((noreturn));//函数不会返回。

void centon() __attribute__((alias("__centon")));//设置函数别名,函数是__cencon,别名是centon.

void main_enter() __attribute__((constructor));//main_enter函数在进入main函数前调用

void main_exit() __attribute__((destructor));//main_exit函数在main函数返回后调用

void fun() __attribute__ ((noinline));//fun函数不能作为inline函数优化

void fun() __attribute__ ((section("specials”)));//将函数放到specials段中,而不是通常的text段中

no_instrument_function、constructor和destructor关键字主要用于剖析(profiling)源代码的。

在调某个用函数之前和退出某个函数之后调用这些剖析函数,配合addr2line工具可以统计程序的运行状态。__cyg_profile_func_enter和__cyg_profile_func_exit是GCC指定的进入和返回调用的函数名。配合no_instrument_function关键字属性可以使用它记录剖析数据,在编译这样的代码的时候,需要在gcc的命令行中加入-finstrument-functions选项,如果要使用addr2line工具分析源代码,则还要加上-g的gcc命令行选项使得源代码中的符号可以保留。这2个函数需要2个参数,void *func_address是将要调用的函数地址,void *call_site是调用该函数的地址。

void __cyg_profile_func_enter( void *func_address, void *call_site )
                                __attribute__ ((no_instrument_function));

void __cyg_profile_func_exit ( void *func_address, void *call_site )
                                __attribute__ ((no_instrument_function));

constructor和destructo是对main函数做上述剖析的关键字,不过这个函数的名称就可以不特定了,而且这样的函数没有参数。如下:

void __main_enter(void) __attribute__ ((constructor));

void __main_exit(void) __attribute__ ((destructor));

描述变量属性的几个重要的关键字:

int alivalue __attribute__ ((aligned(32)));//变量所存放的内存地址32字节边界对齐

struct zrecord {
char id;
int zar[32] __attribute__ ((packed));
};//紧凑安排数据结构中的成员元素。如果不使用packed属性则将zar数组按最小的对齐方式在内存中安排空间,X86平台为4,这样在id和zar之间将会有3个字节的空洞存在。而使用了packed属性后,将不会存在这样的空洞。这次属性是依赖与硬件平台的。

struct domx __attribute__ ((section(“domx”))) = { 0 };
int trigger __attribute__ ((section(“MONLOG”))) = 0; //不将全局变量放在默认的data或bss段中。而指定特定的段中。

描述数据类型的几个重要的关键字:

struct blockm{

      char j[3];

}__attribute__((aligned(32)));//此数据类型的变量的内存地址32字节边界对齐

复合声明返回值(Compound Statements Returning a Value):

在一对圆括号中的最后一个表达式所计算的值为返回值。如:

int rslt = ({

                    int a=5;

                    a+3;

             });//rslt所获得的返回值为8

这个特性的通常用处可书的P87(文档P112)参考。

函数参数构造(Function Argument Construction):

GCC内建了3个函数,用于对某一函数的参数构造,调用相关函数,获得相关函数的返回值。

void *__builtin_apply_args(void);//构造调用此函数的父函数的参数,这些参数都是保存在函数栈(stack)中的。

void *__builtin_apply(void (*func)(), void *arguments, int size);//调用相关函数,第一参数是相关函数的执政,第二个参数是刚才构造参数的函数的返回的指针,第三个参数是建立一个新的栈(stack)而从旧栈中复制数据的尺寸。

__builtin_return(void *result);//获得相关函数的返回。参数是刚才调用相关函数的函数的返回指针。

如:

#include <stdio.h>
int passthrough();
int average();

int main(int argc,char *argv[])
{
   int result;
   result = passthrough();
   printf(“result=%d\n”,result);
   return (0);
}
int passthourgh(int a,int b,int c)
{
void *record;
void *playback;
void (* fn)() = (void (*) ()) average;
record = __builtin_apply_args();
playback = __builtin_apply(fn,record,128);
   __builtin_return(playback);
}

int average(int a,int b,int c)
{
   Return ((a+b+c)/3;
}

内联函数(Inline function):

内联函数在某些情况下类似与宏(macro)。

在一定条件下编译,内联函数将直接将代码内嵌到调用它的父函数中,编译时指定-O选项才可能被内嵌。也可以指定内嵌函数一个属性“always_inline”强制内嵌。

有几种情况将不内嵌,而作为普通函数调用:

1、 不确定数量参数的函数

2、 调用alloca类库函数的

3、 有可变尺寸数组声明的。

4、 非本地goto的。

5、 嵌套调用的。

使用ISO C标准的时候,可以使用__inline__关键字代替inline关键字。

C++学习 __attribute__ ((packed)) 的作用

最近在看我们的代码的时候发现声明类型的时候有 __attribute__ ((packed))的结构体类型声明,如下: [cpp] view plaincopyprint? ...
  • skdkjxy
  • skdkjxy
  • 2015-02-16 16:49:43
  • 1432

C++笔记: __attribute__的使用

GCC使用__attribute__关键字来描述函数,变量和数据类型的属性,用于编译器对源代码的优化。 描述函数属性的几个重要的关键字: void noreturnfun(...
  • qdx411324962
  • qdx411324962
  • 2015-01-07 10:04:02
  • 1935

C++ : __attribute__关键字扩展

GCC使用__attribute__关键字来描述函数,变量和数据类型的属性,用于编译器对源代码的优化。 GCC使用__attribute__关键字来描述函数,变量和数据类型的属性,用于编译器对源...
  • haoxingfeng
  • haoxingfeng
  • 2013-06-24 22:49:30
  • 2548

c++:_attribute_ 使用:

GNU C的一大特色(却不被初学者所知)就是attribute机制。attribute可以设置函数属性(Function Attribute)、变量属性(Variable Attribute)...
  • qq_30968657
  • qq_30968657
  • 2017-02-13 15:17:18
  • 873

函数属性__attribute__((constructor))和__attribute__((destructor))

函数声明如下:     static void breforemain(void) __attribute__ ((constructor));//在main()函数之前被执行     stati...
  • jiayichendddd
  • jiayichendddd
  • 2014-11-15 20:42:30
  • 1150

GUN C/C++ __attribute__ 用法

GNUC的一大特色(却不被初学者所知)就是__attribute__机制。__attribute__可以设置函数属性(FunctionAttribute)、变量属性(Variable Attribut...
  • Jammg
  • Jammg
  • 2015-11-19 20:10:43
  • 1490

C++笔记:__attribute__

GNU C 的一大特色就是__attribute__ 机制。__attribute__ 可以设置函数属性(Function Attribute )、变量属性(Variable Attribute )和...
  • qdx411324962
  • qdx411324962
  • 2015-01-07 10:17:26
  • 931

C++库研究笔记--用__attribute__((deprecated)) 管理过时代码

用__attribute__((deprecated)) 管理过时代码,同时保留兼容的接口 Linux下: #define DEPR_AFTER __attribute__((deprec...
  • mathgeophysics
  • mathgeophysics
  • 2014-10-06 14:30:14
  • 3062

Linux下__attribute__((visibility ("default")))的使用

Linux下__attribute__((visibility ("default")))的使用
  • fengbingchun
  • fengbingchun
  • 2017-12-26 09:05:45
  • 392

__attribute__((constructor)) 高版本gcc不执行

__attribute__((constructor)) // 在main函数被调用之前调用 __attribute__((destructor)) // 在main函数被调用之后调 ...
  • wangchong_fly
  • wangchong_fly
  • 2015-08-27 11:16:36
  • 1361
收藏助手
不良信息举报
您举报文章:C++ : __attribute__
举报原因:
原因补充:

(最多只允许输入30个字)