GNU __attribute__浅析

2023-05-16

GNU __attribute__浅析

1 介绍

__attribute__是GCC的特性,其实是个编译器指令,告诉编译器声明的特性,或者让编译器进行更多的错误检查和高级优化。attribute 可以设置函数属性(Function Attribute)、变量属性(Variable Attribute)和类型属性(Type Attribute)。

2 语法

其位置约束为: 放于声明的尾部“;” 之前。
attribute 书写特征为: attribute 前后都有两个下划线,并切后面会紧跟一对原括弧,括弧里面是相应的__attribute__ 参数。
attribute 语法格式为: attribute ((attribute-list))
当__attribute__ 用于修饰对象时,它就如同C 语言语法体系结构的类型限定符,跟const , volatile , restrict 等属一类。
当__attribute__ 用于修饰函数时,它就相当于一个函数说明符,跟inline,Noreturn 属同一类。
当__attribute_ 用于修饰一个结构体,联合体或者枚举类型,该限定符只能放在类型标识符之前。

3 功能

当我们需要识别当前编译器能否支持GNU 语法拓展,我们可以使用 __GNU __ 宏作为区分。
在这里插入图片描述

4 常用函数属性

4.1 noreturn

表示没有返回值。
这个属性告诉编译器函数不会返回,这可以用来抑制关于未达到代码路径的错误。 C库函数abort()和exit()都使用此属性声明:

extern void exit(int)   __attribute__((noreturn));
extern void abort(void) __attribute__((noreturn));

4.2 always_inline 与noinline

对于声明为内联的函数,会强制优化。所有加了attribute((always_inline))的函数再被调用时不会被编译成函数调用而是直接扩展到调用函数体内。
noinline与上面的相反,声明为非内联函数。

4.3 flatten

用此修饰的函数,在函数中调用的每一个函数都将尽可能地做内联处理。而用flatten 属性修饰的函数,是否内联处理,就要根据编译器当前的编译选项以及当前上下文来定。

4.4 pure

用pure属性修饰的函数用来说明该函数除了返回值之外没有其他任何 效果,并且该函数所返回的值仅仅依赖于函数的形参以及/或全局对象。用 pure属性所修饰的函数可以用来辅助编译器做消除公共子表达式以及帮助 做循环优化,使用这种函数就好比使用算术操作符一般。
用pure属性所修饰的函数体内不应该含有无限循环,不应该对volatile 修饰的全局对象进行访问或是对多个线程所共享的全局对象进行访问,也 不应该访问其他系统资源,比如对文件、套接字等进行操作。简而言之, 对同一个使用pure属性修饰的函数连续做两次调用(如果该函数带有参 数,那么两次调用应该用同样的实参),那么这两次调用所返回的结果应 该始终是相同的。因此,用pure属性所修饰的函数也很容易让编译器做内 联处理。

4.5 const

用const属性修饰的函数与用pure属性修饰的十分类似,不过const属性比pure更严格,它要求函数不能读全局对象。此外,用const属性修饰的函数的参数不能是一个指针类型,而且在用const属性修饰的函数内往往不能调用一个非const属性的函数。

4.6 sentinel

提醒程序员“此可变参数函数需要一个NULL作为最后一个参数。

4.7 format

attribute format属性可以给被声明的函数加上类似printf或者scanf的特征,它可以使编译器检查函数声明和函数实际调用参数之间的格式化字符串是否匹配。format属性告诉编译器,按照printf, scanf等标准C函数参数格式规则对该函数的参数进行检查。这在我们自己封装调试信息的接口时非常的有用。

4.8 section(“name”)

attribute((section(“name”))) 其作用是将作用的函数或数据放入指定名为"section_name"对应的段中。

4.9 unused 与 used

attribute((unused)) 其作用是即使没有使用这个函数,编译器也不警告。
attribute((used)) 其作用是告诉编译器避免被链接器因为未用过而被优化掉。

4.10 weak 与 weakref

什么是弱符号?
若两个或两个以上全局符号(函数或变量名)名字一样,而其中之一声明为weak symbol(弱符号),则这些全局符号不会引发重定义错误。链接器会忽略弱符号,去使用普通的全局符号来解析所有对这些符号的引用,但当普通的全局符号不可用时,链接器会使用弱符号。当有函数或变量名可能被用户覆盖时,该函数或变量名可以声明为一个弱符号。弱符号也称为weak alias(弱别名)。
attribute((weakref))为弱引用,请注意引用与定义的区别。weakref就是申明某个引用为弱引用,弱引用时如果需引用符号不存在也不会链接出错,而是将需要引用的符号定义为WEAK属性及0地址(跟前面的WEAK属性很相似吧)。
weakref的用法有点特别,必须要配合alias使用及必须是static定义。attribute((weak(“target”)))相当于__attribute__((weakref,alias(“target”)))。

5 常用结构体属性

5.1 aligned

attribute((aligned (n))),让所作用的结构成员对齐在n字节自然边界上。如果结构中有成员的长度大于n,则按照最大成员的长度来对齐。例如:
不加修饰的情况:

typedef struct
{
    char  member1;
    int   member2;
    short member3;
}Family;
//输出字节:
NSLog(@"Family size is %zd",sizeof(Family));
//输出结果为:
2020-06-02 10:28:45.380 Study[917:436064] Family size is 12

修改字节对齐为1:

typedef struct
{
    char  member1;
    int   member2;
    short member3;
}__attribute__ ((aligned (1))) Family;
//输出字节:
NSLog(@"Family size is %zd",sizeof(Family));
//输出结果为:
2020-06-02 10:28:05.315 Study[914:435764] Family size is 12

和上面的结果一致,因为 设定的字节对齐为1.而结构体中成员的最大字节数是int 4个字节,1 < 4,按照4字节对齐,和系统默认一致。

修改字节对齐为8:

typedef struct
{
    char  member1;
    int   member2;
    short member3;
}__attribute__ ((aligned (8))) Family;
//输出字节:
NSLog(@"Family size is %zd",sizeof(Family));
//输出结果为:
2020-06-02 10:28:05.315 Study[914:435764] Family size is 16
这里 8 > 4,按照8字节对齐,结果为16。

5.2 packed

让指定的结构结构体按照一字节对齐,测试:
//不加packed修饰

typedef struct {
    char    version;
    int16_t sid;
    int32_t len;
    int64_t time;
} Header;
//计算长度
NSLog(@"size is %zd",sizeof(Header));
输出结果为:
2020-06-02 11:53:47.728 Study[14378:5523450] size is 16
可以看出,默认系统是按照4字节对齐。

//加packed修饰

typedef struct {
    char    version;
    int16_t sid;
    int32_t len;
    int64_t time;
}__attribute__ ((packed)) Header;
//计算长度
NSLog(@"size is %zd",sizeof(Header));
输出结果为:
2020-06-02 11:57:46.970 Study[14382:5524502] size is 15

6 常用变量属性

6.1 aligned

指定变量地址对齐。如下:

6.2 section(“name”)

attribute((section(“name”))) 其作用是将作用的函数或数据放入指定名为"section_name"对应的段中。

6.3 at

__attribute__((at(0xC000_8000))) 其作用是将作用的函数或数据放入指定的地址。

6.4 多种属性叠加配置方法

static u32_t __mmu_ttb[4096] __attribute__((section(".mmu_ttb"), aligned(0x4000)));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GNU __attribute__浅析 的相关文章

  • Windows slmgr.vbs 命令详解

    系统软件授权管理工具主要是用来查看系统的激活状态 以及密钥许可证等信息 在现在不在是使用 接参数了 现在 接参数 详解可以在cmd窗口输入slmgr vbs了解 常用参数 使用方式 再次提醒是使用 而不是 ipk 配合密钥使用 安装密钥 替
  • 在关联文件中更改新版本的版本号(文档)

    我很想知道你们是如何处理的修改版本号对于新版本问题 如何处理关联文件 例如手册页等 中的版本号 该软件是使用 gnu 工具链构建的 因此 autoconf automake 等可用并用于应用程序的版本号 这样信息就可以被重用 git 被用作
  • 臃肿的 echo 命令

    看一下 echo 命令的以下实现 http bxr su o bin echo echo c 开放BSD http bxr su d bin echo echo c 蜻蜓 http bxr su n bin echo echo c 网络BS
  • include_next 预处理器指令导致 MSVC 中出现问题

    我知道 inlcude next 恰好是 C 预处理器的 GNU 扩展 我在使用 MSVC 编译 Gnu 库代码时遇到问题 例如 有一个 stdio h 头文件或者更确切地说GNU like
  • “表达式中的声明和声明”是 GNU C 特有的吗?

    Are 表达式中的声明和声明特定于 GNU C 或者这个功能也包含在C99标准中 它是 GCC 扩展 参见海湾合作委员会文档 例如这里是 gcc 4 3 3 查看 GCC 扩展的完整列表 和C99 规范可在此处获取 如果您使用 pedant
  • Ubuntu 上的 R BayesVarSel 安装

    我正在尝试安装BayesVarSel封装在一个ubuntu12盒上AWS EC2 它在我的 Windows 7 机器上运行良好 R 2 15 1 I ve attached a screenshot of the error message
  • 错误:无法将 'std::basic_string::iterator ...' 转换为 'const char* for argument '1' ...'

    我收到以下错误 error cannot convert std basic string
  • GNU Arm 汇编器将 ORR 更改为 MOVW

    我正在组装以下汇编器 syntax unified cpu cortex m4 thumb section text orr r1 12800 orr r1 12801 本质上 只有两个 OR 指令 如果我查看结果objdump I get
  • 强制 linux 排序使用字典顺序

    我生成了一个带有伪随机数的文本文件 如下所示 853340442 1130519212 2070936922 707168664 2076185735 2135012102 166464098 1928545126 5768715 1060
  • GNU 制作一种双冒号

    我在理解以下 gmake 语法时遇到了一些问题 OBJ foo o bar o OBJ o cpp CC c MMD MP INCLUDES CFLAGS lt o sed create empty targets in file 我不确定
  • sed 使用:预期上下文地址

    我用sedmacOS 上的命令包含以下文本 cat pets txt This is my cat my cat s name is betty This is your dog your dog s name is frank This
  • 为什么我的 Mac (OS X 10.7.3) 有旧版本 (2.3) 的 Gnu Bison?

    我的 mac 上的 GNU Bison 版本是 2 3 但我知道 Bison 2 5 很久以前就发布了 这本书弗莱克斯和野牛使用2 5版本 我应该自己升级到2 5吗 有必要吗 2 3和2 5有什么区别 我在 MacOSX 10 9 5 上遇
  • 为什么 Nettle 2.4 的 `configure` 找不到 GMP 5.0.2?

    我正在尝试建立GnuTLS http www gnu org software gnutls 在 Mac OS X 10 5 Leopard 服务器上 是的 我知道 它有点过时 但这就是该服务器目前正在运行的 并且遇到了构建问题Nettle
  • GNU 汇编器:访问损坏的共享库错误

    我正在读一本书 专业汇编语言 我想用动态链接 我正在使用 AT T 语法和 GNU 汇编器 我的电脑有 Ubuntu 12 04 64 位系统 我正在尝试使用 cpuid 汇编器操作码显示供应商 ID 字符串 并且printf C函数代替l
  • `int` 是原子类型吗?

    Quoting gnu https www gnu org software libc manual html node Atomic Types html 实际上 您可以假设 int 是原子的 您还可以假设指针类型是原子的 非常方便 这两
  • GNU GAS 汇编中是否有代表当前地址的符号?

    我很想知道是否有任何特殊的 GAS 语法可以实现与 NASM 示例中相同的效果 SECTION data msg db Hello World 10 0 the 0 terminated string len equ msg means c
  • 在 Linux 上获取机器 ID 的最佳方法?

    获取唯一机器 ID 的最佳实践方法是什么GNU Linux for i386建筑学 除了这个还有什么好的办法吗mac地址 根据您的内核 DMI 信息可能可以通过 sysfs 获得 尝试一下 cat sys class dmi id boar
  • 对于 Makefile 变量的每个目标

    我的 makefile 如下所示 apps app1 app2 app3 all dir app1 app2 app3 zip cleanup 现在我想在列表上做一些循环apps多变的 就像是 loop on apps endloop 是否
  • grep 正则表达式 空白行为

    我有一个文本文件 其中包含以下内容 12 34 EUR 5 67 EUR EUR 之前有一个空格 我忽略了 0 XX EUR 我试过 grep 1 9 0 9 0 9 2 sEUR gt didn t match grep 1 9 0 9
  • 链接器输入文件未使用的 c++ g++ make 文件

    我无法弄清楚是什么导致了我在制作项目时不断遇到的错误 i686 apple darwin11 llvm g 4 2 lncurses linker input file unused because linking not done 我的

随机推荐

  • pyrealsense2 初步使用教程

    这是我的推广信息 xff0c 以激励自己更好的分享自己的知识和经验 xff01 也希望看到的你能够多多支持 xff0c 谢谢 xff01 1 滴滴云AI大师 目前滴滴云正在大力推广自己的云计算服务 xff0c 需要购买的朋友们用我的AI大师
  • 如何表示MASK

    这是我的推广信息 xff0c 以激励自己更好的分享自己的知识和经验 xff01 也希望看到的你能够多多支持 xff0c 谢谢 xff01 1 滴滴云AI大师 目前滴滴云正在大力推广自己的云计算服务 xff0c 需要购买的朋友们用我的AI大师
  • 使用合成数据改善机器学习中的极度不平衡数据集

    这是我的推广信息 xff0c 以激励自己更好的分享自己的知识和经验 xff01 也希望看到的你能够多多支持 xff0c 谢谢 xff01 1 滴滴云AI大师 目前滴滴云正在大力推广自己的云计算服务 xff0c 需要购买的朋友们用我的AI大师
  • NVIDIA A100 深度解密(一):GPU 峰值计算那些事

    这是我的推广信息 xff0c 以激励自己更好的分享自己的知识和经验 xff01 也希望看到的你能够多多支持 xff0c 谢谢 xff01 1 滴滴云AI大师 目前滴滴云正在大力推广自己的云计算服务 xff0c 需要购买的朋友们用我的AI大师
  • 算法中七种常见的时间复杂度

    这是我的推广信息 xff0c 以激励自己更好的分享自己的知识和经验 xff01 也希望看到的你能够多多支持 xff0c 谢谢 xff01 1 滴滴云AI大师 目前滴滴云正在大力推广自己的云计算服务 xff0c 需要购买的朋友们用我的AI大师
  • Python之日志处理(logging模块)

    这是我的推广信息 xff0c 以激励自己更好的分享自己的知识和经验 xff01 也希望看到的你能够多多支持 xff0c 谢谢 xff01 1 滴滴云AI大师 目前滴滴云正在大力推广自己的云计算服务 xff0c 需要购买的朋友们用我的AI大师
  • 李群、李代数之我的理解

    我目前的研究领域转到了立体匹配方向 但是基础很薄弱 xff0c 很多理论知识都需要补充 希望自己能够满满的累积起足够的基础知识 这篇博客主要是记录自己对李群 李代数的初步理解 xff0c 还请大家一些讨论进步 参考资料 lie group
  • 科研神器软件(关于查词、翻译)

    整理了几个和科研相关的神器软件 网址 xff0c 关于英文写作 翻译 查词的 xff0c 记录如下 xff1a 英文写作的词句库网站 xff0c 包含大量的例句和写作模板 xff1a https www phrasebank manches
  • CT典型数据——shepp_logan体模数据的生成 python版本

    phantominator包介绍 网址 xff1a https github com mckib2 phantominator安装 xff1a pip install phantominator简介 xff1a 用于简便的生成 numeri
  • 解决 dpkg 安装出错后的 Sub-process /usr/bin/dpkg returned an error code (1) 错误

    前言 在使用 dpkg i 安装 deb软件包的过程中 xff0c 会出现安装失败的可能 之后无论用 sudo apt install f or sud apt autoremove 等常见的修复命令都是无效的 网络上很多解决方案都直接给出
  • Ubuntu20.4 休眠之后网络出现问题的解决方案

    问题简介 Ubuntu20 04 在休眠之后 xff0c 如果网络出现了无法连接或者无法共享的各种问题 xff0c 只有重启才能解决 xff0c 那么以下操作可以让你不用重启电脑 解决方案 重启 network kernel modules
  • 京东京造K系列机械键盘在Linux下的使用

    前言 京东京造是一款为Mac iPad iPhone适配出色的蓝牙键盘 xff0c 官方也支持Win系统 这款键盘 xff0c 其实就是Keychron K8 xff0c 国外非常火的Mac键盘 xff0c 深受苹果用户的喜爱 YouTub
  • 事件相机仿真器(ESIM)安装记录

    前言 在 Ubuntu 20 04 下安装 ESIM 事件相机仿真器 特此记录 资料 官网 https github com yunxdai rpg esim 安装指导 https github com uzh rpg rpg esim w
  • [翻译]解决使用 git clone 命令时出现的 ‘gnutls_handshake() failed’ 错误

    错误介绍 使用 git clone 时出现如下错误 xff1a fatal unable to access 39 https github com Syllo nvtop git 39 gnutls handshake failed Th
  • 解决 pycharm 从快捷方式启动与从终端启动环境不同的问题

    前言 博主在安装了 ros 相关的两个python包 rospy 和 roslaunch 之后 xff0c pycharm 无法 import 这两个包 但是在终端中用同样的python解释器又可以import这两个包 同时 xff0c 从
  • Ubuntu 常用命令使用记录

    Linux 查找包含特定关键词的文件 grep r E 39 word1 word2 word3 39 yourpath gt gather log 如果要and关系查找 则要用管道 grep pattern1 files grep pat
  • Linux 通过 SSH 挂载远程文件夹

    前言 在两台Linux电脑之间 xff0c 我们可以通过ssh方便的登录另一台电脑并访问它的文件或者文件夹 但这都是我们用户在进行操作 想要在一台电脑上运行程序 xff0c 处理放在另一台电脑上的文件时 xff0c 我们应该如何设置呢 xf
  • ROS节点的初始化及退出详解(ros::init、SIGINT、ros::ok、ros::NodeHandle)

    希望大家收藏 xff1a 本文更新地址 xff1a https haoqchen site 2018 04 28 ROS node init 左侧专栏还在更新其他ROS实用技巧哦 xff0c 关注一波 xff1f 很多ROS新手编写节点的时
  • Ubuntu 终端前多了个 base

    Ubuntu 终端前多了个 base xff0c 想将base去掉 xff0c 如何操作 xff1f 原文 xff1a https blog csdn net qq 35544714 article details 109270602 装完
  • GNU __attribute__浅析

    GNU attribute 浅析 1 介绍 attribute 是GCC的特性 xff0c 其实是个编译器指令 xff0c 告诉编译器声明的特性 xff0c 或者让编译器进行更多的错误检查和高级优化 attribute 可以设置函数属性 x