GCC 关键字inline探究

gcc:inline attribute#ifndef __always_inline 如果之前没有定义这个宏,就定义inline# ifndef __always_inline 如果之前没有定义这个宏,就定义 # define __always_inline inline # endif。 阅读详情
一、inline介绍

先看造型:

inline int test()
{
    ......
    return 0;
}

int main()
{
    test();
    return 0;
}

我们知道,如果test函数没有inline关键字修饰的时候,程序执行到调用test的时候,会从main函数跳到test函数执行。为了从test函数返回到mian函数后,能从调用test函数的下一条指令执行,在调用test函数前,我们必须对现场进行保护(将一些寄存器的值压栈)。

那如果加了inline关键字呢,那编译系统就会将test函数当做一个宏来处理,即直接在main函数中展开。在这里需要注意的是,并不是所有函数加上inline关键字就一定会在main函数中展开,一般要求inline关键字尽可能的简单。

二、反汇编看效果

源码:

#include <stdio.h>

static inline int test1()
{
int a = 1;

printf("Hello test1.\n");

return a;
}

static inline int test2()
{
int b = 2;

printf("Hello test2.\n");

return b;
}

int main()
{
test1();
test2();

return 0;
}

第一次编译:
arm-none-linux-gnueabi-gcc inline.c -o inline

反汇编如下:
arm-none-linux-gnueabi-objdump -d inline > log

查看log文件
cat log:

部分汇编代码
000083d4 <main>:
    83d4: e1a0c00d  mov ip, sp
    83d8: e92dd800  push {fp, ip, lr, pc}
    83dc: e24cb004  sub fp, ip, #4 ; 0x4
    83e0: eb000005  bl 83fc <test1>
    83e4: eb000012  bl 8434 <test2>
    83e8: e3a03000  mov r3, #0 ; 0x0
    83ec: e1a00003  mov r0, r3
    83f0: e24bd00c  sub sp, fp, #12 ; 0xc
    83f4: e89d6800  ldm sp, {fp, sp, lr}
    83f8: e12fff1e  bx lr

000083fc <test1>:
    83fc: e1a0c00d  mov ip, sp
    8400: e92dd800  push {fp, ip, lr, pc}
    8404: e24cb004  sub fp, ip, #4 ; 0x4
    8408: e24dd008  sub sp, sp, #8 ; 0x8
    840c: e3a03001  mov r3, #1 ; 0x1
    8410: e50b3010  str r3, [fp, #-16]
    8414: e59f0014  ldr r0, [pc, #20] ; 8430 <test1+0x34>
    8418: ebffffb9  bl 8304 <_init+0x50>
    841c: e51b3010  ldr r3, [fp, #-16]
    8420: e1a00003  mov r0, r3
    8424: e24bd00c  sub sp, fp, #12 ; 0xc
    8428: e89d6800  ldm sp, {fp, sp, lr}
    842c: e12fff1e  bx lr
    8430: 00008504  .word 0x00008504

00008434 <test2>:
    8434: e1a0c00d  mov ip, sp
    8438: e92dd800  push {fp, ip, lr, pc}
    843c: e24cb004  sub fp, ip, #4 ; 0x4
    8440: e24dd008  sub sp, sp, #8 ; 0x8
    8444: e3a03002  mov r3, #2 ; 0x2
    8448: e50b3010  str r3, [fp, #-16]
    844c: e59f0014  ldr r0, [pc, #20] ; 8468 <test2+0x34>
    8450: ebffffab  bl 8304 <_init+0x50>
    8454: e51b3010  ldr r3, [fp, #-16]
    8458: e1a00003  mov r0, r3
    845c: e24bd00c  sub sp, fp, #12 ; 0xc
    8460: e89d6800  ldm sp, {fp, sp, lr}
    8464: e12fff1e  bx lr
    8468: 00008514  .word 0x00008514

第二次编译

arm-none-linux-gnueabi-gcc -O  inline.c -o inline

反汇编如下:
arm-none-linux-gnueabi-objdump -d inline > log

查看log文件
cat log:

000083d4 <main>:
    83d4: e52de004  push {lr} ; (str lr, [sp, #-4]!)
    83d8: e24dd004  sub sp, sp, #4 ; 0x4
    83dc: e59f0018  ldr r0, [pc, #24] ; 83fc <main+0x28>
    83e0: ebffffc7  bl 8304 <_init+0x50>
    83e4: e59f0014  ldr r0, [pc, #20] ; 8400 <main+0x2c>
    83e8: ebffffc5  bl 8304 <_init+0x50>
    83ec: e3a00000  mov r0, #0 ; 0x0
    83f0: e28dd004  add sp, sp, #4 ; 0x4
    83f4: e49de004  pop {lr} ; (ldr lr, [sp], #4)
    83f8: e12fff1e  bx lr
    83fc: 0000849c  .word 0x0000849c
    8400: 000084ac  .word 0x000084ac

总结如下:
对于inine关键字,如果在编译的时候不加优化选项(-O 或 -O2)时,编译系统不会将其修饰的函数在mian函数中展开。但是会把被inline修饰的函数 代码按其在main函数中的调用顺序放在main后面。
如果在编译的时候加了优化选项,被inline修饰的函数大部分情况下会在main函数中展开。

注意:inline是一个建议型关键字,具体有没有被展开反汇编一看便知。


原文地址: http://blog.chinaunix.net/uid-26833883-id-3351281.html
【C语言】inline 关键字详解 inline关键字用于建议编译器将函数内联展开,以减少函数调用的开销。内联函数适用于简单、频繁调用的函数,能够提高程序的执行效率。 阅读详情

相关推荐

gcc: 编译错误,“undefined reference to”, inline 函数

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66132 https://gcc.gnu.org/gcc-5/porting_to.html gcc的解释是,gcc高版本使用了新的C标准C99的语法规则,而在之前gnu89版本语法。 While -std=gnu89 employs the GNU89 inline semantics, -std=gnu11 uses the C99 inline semantics. The C99 inline semanti

mzhan017的博客 2563

gcc 之 inline

inline关键字在GCC参考文档中仅有对其使用在函数定义(Definition)上的描述,而没有提到其是否能用于函数声明(Declare).inline关键字不应出现在函数声明中。inline关键字仅仅是建议编译器做内联展开处理,而不是强制。在gcc编译器中,如果编译优化设置为O0,即使是inline函数也不会被内联展开,除非设置了强制内联(__attribute__((always_inlin...

weixin_33843409的博客 309

昇腾910B多卡环境下hccl-test性能调优实战

本文详细介绍了昇腾910B多卡环境下hccl-test性能调优的实战经验,包括环境搭建、CANN工具链配置、性能测试与高级调优技巧。通过优化缓冲区、PCIe拓扑和中断亲和性设置,显著提升多卡通信效率,为AI训练提供稳定高效的计算支持。

weixin_29216049的博客 825

gcc 编译器对 inline 函数的支持

C99版的C语言引入了inline关键字开始支持inline 函数,在这之前传统的C语言(C89)是没有inline 关键字的,也不支持inline 函数。不过大多数 C89 的编译器都将inline作为一种附加特性早早的就加进去了。gcc 也不例外,不过gcc增加inline特性时C99还没定型,gcc中inline 的语意与C99也有些许的区别。这里就主要说说gcc 中的inline 特性。

Ivan 的专栏 1万+

别再乱改基础库了!手把手教你搞定uni-app小程序上传图片报错(chooseAndUploadFile权限篇)

本文详细解析了uni-app开发微信小程序时遇到的`chooseAndUploadFile`权限报错问题,并提供了四步解决方案。从隐私协议与API权限的关联入手,指导开发者正确配置后台声明、双重提交策略和版本管理,避免降级基础库等常见误区,确保小程序合规运行。

weixin_33709364的博客 276

利用图层自动识别算法实现CAD到Revit BIM模型的高效转换 - VS2022与AutoCAD2024开发环境配置指南

本文详细介绍了如何配置VS2022与AutoCAD2024开发环境,并利用图层自动识别算法实现CAD图纸到Revit BIM模型的高效自动化转换。通过解析CAD图层的规律性,该算法能智能识别并分类墙、门、窗等构件,提取几何信息并驱动Revit自动创建三维模型,从而将传统繁琐的人工“翻模”工作转化为高效、准确的自动化流程,大幅提升BIM模型创建效率。

Apple的专栏 1124

C语言--宏定义和inline学习

编译器使用的是gcc。在学习C语言的宏定义和inline关键字修饰函数时,为了能很好的明白二者的区别,所以这里就记录下二者在预处理时生成中间文件的区别。 宏定义: 优点:不会生成中间代码,在调用处会直接替换掉指定的宏名称 缺点:不会检测传入的参数合法性和参数的类型,只是在调用的位置进行了简单的替换 生成中间文件的区别 1.宏定义 使用宏的方式很简单,通过关键字#d...

LoopherBear的博客 718

IBM x3650M4服务器更换主板后,导入原有硬盘阵列信息

x3650m4服务器主板坏了,更换好的主板,需要导入原来硬盘的里面的阵列信息 1、开机有提示信息,按C导入配置 2、按Y继续 3、点击start进入阵列卡配置 4、选择configurations 1,点击preview 5、预览硬盘的阵列信息,点击import导入 6、导入成功,可以查看到阵列信息 7、重启服务器,进入操作系统 如果重启找不到操作系统,重启按f12,手动选择从onboard sas controller启动,进入系统一次后面重启就会自动找到并引导系统了。 8、有时候导入阵列

zds00virtue的博客 2万+

MDK Keil使用GCC编译

简介 Keil MDK-ARM 可以与 GNU 编译器集合 (GCC) 一起使用。GCC 是一个有众多贡献者的开源开发工作,它广泛可用并支持许多设备。 Keil 默认使用的是ARMCC编译MCU工程代码。因此设置为GCC编译需要进行以下配置。 操作步骤 GCC下载地址: https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm/downloads 要启用 MDK

路过的熊的博客 7852

ns3-gym入门(二):linear-mesh例子详解

学习ns3-gym中关于IEEE 802.11网状网络中控制随机接入的例子linear-mesh

zoe2222226666的博客 1841

WRF替换静态地理数据中的土地利用数据(WRF替换下垫面数据)

   在进行自己的WRF项目模拟的时候,因为需要用中国土地利用数据替换WRF内嵌老旧的土地利用数据,故需要将土地利用进行替换。我使用的中国的土地利用数据是来自中国土地利用数据(1980-2015)。其中我以下载的lucc1980为例进行演示。 1、坐标转换    (1)下载的lucc1980数据如下图所示:    (2)在ArcMap中打开如下图所示: 打开属性表可以看到,lucc1980的坐标系为投影坐标系Krasovsky_1940_Albers,数据格式为GRID。这里需要将投影坐标系转换成地理坐

GIS 1万+

GCC 中的inline关键字

inline关键字是C99中新加的,使用的时候,要注意以下两点: 1、inline关键字在GCC参考文档中仅有对其使用在函数定义(Definition)上的描述,而没有提到其是否能用于函数声明(Declare)。 从inline的作用来看,其放置于函数声明中应当也是毫无作用的:inline只会影响函数在translation unit(可以简单理解为C源码文件)内的编译行为,只要超出了这个范围

957

高级技能-高可用和容灾-两地三中心、异地多活架构

两地三中心和异地多活是当前主流的跨地域高可用架构方案。两地三中心通过生产中心、同城灾备和异地灾备的组合,提供多级容灾能力,适合对数据安全要求高的行业。异地多活则采用单元化设计,多个站点同时服务,提升资源利用率,但需解决网络延迟、数据冲突等挑战。两种架构在RTO/RPO、一致性、改造成本等方面各具特点,企业应根据业务规模、一致性要求和预算进行选择,可考虑从同城双活起步,逐步向异地多活演进。混合架构可能是平衡容灾与多活的务实方案。

zhongjianfeng100的博客 168

c语言inline有什么作用,C语言inline关键字

一、inline关键字的概念inline关键字是C99标准的型关键字,其作用是将函数展开,吧函数的代码复制到每一个调用处。这样调用函数的过程就可以直接执行函数代码,而不发生跳转、压栈等一般性函数操作。可以节省时间,也会提高程序的执行速度。 二、inline关键字实例在编写程序过程中,对于短小而且需要频繁调用的函数,可以将其声明为inline()函数。在调用该函数的过程中编译器会自动选择是否展开该函...

weixin_30709043的博客 9422

6.14华为OD机试真题 新系统 - 字符串格式调整 (Java/Py/C/C++/Js/Go)

# **字符串格式调整** > 2026 华为OD机试真题 6月14日华为OD上机新系统考试真题 100 分题型 点击查看华为 OD 机试真题完整目录:[2026最新华为OD机试新系统卷 + 双机位C卷 真题题库目录|全覆盖题库 + 逐点算法考点详解](https://blog.youkuaiyun.com/banxia_frontend/article/details/160346662) # 题目描述 输入一个字符串,字符串中只包含大写字母和数字。要求将字符串中的所有数字提取出来,按出现的顺序组

算法大师! 944

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

gcc编译inline函数报错:未定义的引用

一个简单的inline函数 inline void swap(char *x, char *y){char t = *x; *x=*y; *y=t;} 编译的时候报错 gcc --std=c11 -Wall -c -o permutation.o permutation.c gcc permutation.o -lgmp -o permutation permutation.o:pe...

chenxizhan1995的博客 9570

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

C语言的inline关键字

先收藏了 一直以来我就认为inline关键字是C++中的。今天我看到一篇讲关于C语言的inline关键字的。呵呵。。。 原来是我弄错了。看来以后定义一些宏命令完全可以用这样的一些inline函数来代替了。以下是我从网上搜集来的知识点(来源:http://superding.spaces.live.com/Blog/cns!89E842A8485366C7!1137.entr

lcydhr的专栏 601

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

GCC和C99标准中inline

GCC和C99标准中inline使用上的不同之处 本文介绍了GCC和C99标准中inline使用上的不同之处。inline属性在使用的时候,要注意以下两点:inline关键字在GCC参考文档中仅有对其使用在函数定义(Definition)上的描述,而没有提到其是否能用于函数声明(Declare)。 从 inline的作用来看,其放置于函数声明中应当也是毫无作用的:inline只会影响函数在translation unit(可以简单理解为C源码文件)内的编译行为,只要超出了这个范围inline属性就没有任

HideInTime的博客 950

inline - noinline

<!-- p {margin-bottom:0.21cm} -->  noinline 关键字用来通知编译器不要内联这个函数。 【赛迪网讯】inline属性在使用的时候,要注意以下两点:inline关键字在GCC参考文档中仅有对其使用在函数定

wenhui_的专栏 9144

GCC和C99标准中的inline

本文介绍了GCC和C99标准中inline使用上的不同之处。inline属性在使用的时候,要注意以下两点: inline关键字在GCC参考文档中仅有对其使用在函数定义(Definition)上的描述,而没有提到其是否能用于函数声明(Declare)。 从inline的作用来看,其放置于函数声明中应当也是毫无作用的:inline只会影响函数在translation unit(可以

Decisiveness的专栏 2248

GCC编译inline函数

GCC来编译包含inline函数的头文件gestalt.h,具体包含以下几个inline函数:static inline int gestalt_test_bit (int nr, volatile void * addr){    return test_bit(GESTALT_BITMAP_SHIFT(nr), &(GESTALT_BITMAP_ENTRY(nr, addr)));

憩园幽幽的专栏 1674

GCC and C99 inline

http://superding.spaces.live.com/Blog/cns!89E842A8485366C7!1137.entryhttp://www.greenend.org.uk/rjk/2003/03/inline.htmlC语言的inline转以前我用Docbook写的一篇关于C语言inline关键字使用的文章。唉,要是能用docbook直接写Blog就好了。用

rotus的专栏 4577
上一篇: linux 进程地址空间的一步步探究
下一篇: Linux 内核自解压流程分析
Omni-Space
博客等级 码龄11年 2158粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值