首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

GCC:仅插入非内联函数

GCC是GNU编译器套件(GNU Compiler Collection)的缩写,是一套开源的编译器工具集。它包含了多个编译器,其中最常用的是C语言编译器(gcc)和C++语言编译器(g++)。GCC具有跨平台的特性,可以在多种操作系统上使用。

GCC的主要功能是将源代码转换为可执行的机器代码。它支持多种编程语言,包括C、C++、Objective-C、Fortran、Ada等。GCC提供了丰富的编译选项和优化功能,可以根据需求进行配置,以获得更高的性能和更小的代码体积。

GCC的非内联函数是指在函数声明或定义前加上关键字"inline"的函数。非内联函数的特点是函数体与函数调用位置分离,需要在函数调用时进行函数体的跳转。相比于内联函数,非内联函数的代码体积较大,但可以提高代码的重用性和可维护性。

非内联函数的插入是指在编译过程中将非内联函数的代码插入到函数调用的位置。这样做的好处是可以减少函数调用的开销,提高程序的执行效率。但同时也会增加代码的体积,可能会导致程序的内存占用增加。

非内联函数适用于函数体较大或频繁调用的情况。在编译过程中,GCC会根据函数的调用情况和编译选项来决定是否将函数插入到调用位置。

腾讯云提供了云计算相关的产品和服务,可以满足用户在云计算领域的需求。具体推荐的产品和产品介绍链接地址可以参考腾讯云官方网站。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【C++】内联函数 ② ( 内联函数不能单独声明 | C++ 编译器编译内联函数分析 | 内联编译 | 内联函数指令直接插入到调用位置 | 内联函数没有额外调用开销 )

a : b; } 可以 在 头文件 或 其它位置 声明 普通函数 : int fun(int a, int b) 2、内联函数声明 inline 内联函数 不能进行单独的声明 , inline 关键字只要使用了...C++ 编译器 在 编译代码时 , 如果发现 函数 前面有 " inline " 关键字 , 就会对该 函数 进行 " 内联编译 " , 上述 进行 " 内联编译 " 的函数 , 就是 " 内联函数..." ; 2、内联函数指令直接插入到调用位置 生成代码时 , 在生成的 库 中 , 是找不到 " 内联函数 " 的 , C++ 编译器 直接 将 内联函数 的 CPU 指令 , 插入到了调用 内联函数 的位置...; 3、内联函数没有额外调用开销 " 内联函数 " 的性能非常高 , 没有 函数调用 的额外开销 ; 函数调用 的 额外开销 包括 : 压栈 跳转 返回 等操作 ; 4、代码示例 - 内联函数进行内联编译过程...内联函数内联函数 调用代码 : // 内联函数 : 获取 a 和 b 中较小的值 inline int fun(int a, int b) { return a < b ?

21840

实用技能分享,充分利用内联函数内联汇编,内部函数和嵌入式汇编提升代码执行效率和便捷性(2021-12-17)

一、内联函数Inline function: 内联函数就是带inline关键字修饰的函数,作用是将函数直接嵌入到调用此函数的代码中,从而降低调用此函数所占用的时间。...因为这样才能发挥内联的优势: LL库这里用的关键字是__STATIC_INLINE,这个是ARM的CMSIS软件包专门做的定义方式,对MDK,IAR和GCC都做了适配,通用。...二、内联汇编Inline assembler: 内联汇编可以将汇编程序指令直接插入到 C 或 C++ 函数中。...cmsis_armcc.h :对应MDK AC5头文件 cmsis_gcc.h : 对应各种基于GCC的编译器头文件 cmsis_clang.h : 对应MDK AC6头文件 cmsis_iccarm.h...需要硬件开平方指令,可以使用__sqrtf,开方操作需要12-14个时钟周期。

1.3K30
  • 内联函数 c-实用技能分享,充分利用内联函数内联汇编

    一、内联函数Inline :   内联函数就是带inline关键字修饰的函数,作用是将函数直接嵌入到调用此函数的代码中,从而降低调用此函数所占用的时间。   ...因为这样才能发挥内联的优势:   LL库这里用的关键字是,这个是ARM的CMSIS软件包专门做的定义方式,对MDK,IAR和GCC都做了适配,通用。   ...二、内联汇编Inline :   内联汇编可以将汇编程序指令直接插入到 C 或 C++ 函数中。通常,如果需要访问在 C 中不可访问的硬件资源或者编写时间关键的代码序列,使用内联汇编非常方便。   ....h :对应MDK AC5头文件   .h: 对应各种基于GCC的编译器头文件   .h : 对应MDK AC6头文件   .h : 对应IAR头文件   比如我们常用的函数设置主堆栈指针,实现如下:...需要硬件开平方指令内联函数 c,可以使用,开方操作需要12-14个时钟周期。

    75740

    熟悉又陌生的arm 编译器详解(armccarmclang)

    sys.c --no_depend_single_line --md 1 在这里插入图片描述 –diag_error/–diag_suppress/–diag_warning 对编译的警告以及错误进行处理...在这里插入图片描述 –feedback=filename 编译反馈,主要是用来去除没有用到的代码 (数据以及code),需要与链接的选项一起使用,通常需要编译两次。...需要注意的是,并不是所有的函数都可以内联,比如递归函数。 –littleend/–bigend 数据大小端设置, -O0/O1/O2/O3/Otime/Ospace 编译优化选项 -O0最小优化。...删除未使用的内联函数和未使用的静态函数。关掉严重降低调试视图的优化。如果与 –debug 一起使用,此选项会给出总体上令人满意的调试视图且具有良好的代码密度。...编译器自动内联函数 -O3最大优化。启用调试后,此选项通常会提供较差的调试视图。ARM 建议在较低的优化级别进行调试。

    2K40

    c语言内联函数和动态链接库的制作和使用

    内联函数 1.什么是内联函数: 简单的来说,内联函数就是在你定义一个函数的时候,在最前面加一个关键字inline(一般在定义一个函数前加inline关键字有用,但在声明函数前面加inline关键字不起作用...inline void Foo(int x, int y); // inline 函数声明放在一起 void Foo(int x, int y) { } void Foo(int x, int y...(这里我的理解就是,因为内联函数具有函数和带参宏的特点,所以当多次调用内联函数的话,函数里面的语句就直接放到当执行到内联函数的那个地方,就不用跑到定义的地方去执行了,又开辟栈空间了)。...3.内联函数的使用限制: 内联能提高函数的执行效率,为什么不把所有的函数都定义成内联函数?如果所有的函数都是内联函数,还用得着“内联”这个关键字吗?...另一方面,每一处内联函数的调用都要复制代码,将使程序的总代码量增大,消耗更多的内存空间。以下情况不宜使用内联函数: (1)如果函数体内的代码比较长,使用内联将导致内存消耗代价较高。

    1.4K30

    GNU C 内联汇编介绍

    GNU C 内联汇编介绍 简介 1、很早之前就听说 C 语言能够直接内嵌汇编指令。但是之前始终没有去详细了解过。最近由于某种需求,看到了相关的 C 语言代码。...首先来看一下在 C 代码中插入汇编指令的框架代码: __asm__("汇编指令1\n\t" "汇编指令2\n\t" "汇编指令3\n\t" "汇编指令n"...---- 破坏寄存器列表 1、这一行告诉 GCC内联的汇编代码中,哪些寄存器可能会被使用到(显式/隐式)。那么 GCC 就会在进入内联汇编之前将这些寄存器保存起来,最后再恢复。...因此上述的例子中由于没有影响到其他输出、输入的寄存器,所以可以省略破坏列表。...---- GCC 的一些新特性 1、新的 GCC 允许我们为随机分配的寄存器命名,这样极大的方便我们编写内联汇编代码。

    2K10

    内联汇编很可怕吗?看完这篇文章,终结它!

    语法规则 2. test1.c 插入空指令 3. test2.c 操作全局变量 4. test3.c 尝试操作局部变量 二、扩展 asm 格式 1. 指令格式 2....2. test1.c 插入空指令 #include int main() { asm ("nop"); printf("hello\n"); asm ("nop...眼见为实,我们把这 3 个变量放到 main 函数的内部,作为局部变量来试一下。...它使用来修饰输出的,对输出寄存器或内存地址提供额外的说明,包括下面4个修饰符: +:被修饰的操作数可以读取,可以写入; =:被修饰的操作数只能写入; %:被修饰的操作数可以和下一个操作数互换; &:在内联函数完成之前...可以看到,在内联汇编代码之前,gcc 没有选择使用寄存器 %edx。

    2K20

    ART 下的方法内联策略及其对 Android 热修复方案的影响分析

    返回方法参数; 2.3. 返回一个方法内声明的常量或null; 2.4....从被调用方法所在类的静态成员获取并返回获取的值;(注意,static final成员会被优化成常量,此时要参照2.3) 2.5. 设置了被调用方法所在类的静态成员的值; 2.6....设置了被调用方法所在类的静态成员的值,并返回一个方法内声明的常量或null。 注:条件2隐含了一个条件,就是被调用的方法的字节码不超过2条。...[1501557187475_1339_1501557188531.png] 将旧方法修改为Native类型,并将其实现指向一个公共分发函数,由该函数负责调用新方法 Java派的做法也有两种: [...对于Java派而言,插入一段逻辑的做法基本不受影响,因为内联时会将被修改的方法连同插入的那段逻辑一起复制到调用者的代码里,结果和内联之前是等价的。

    3.2K11

    __asm__ volatile 之 C语言嵌入式汇编

    GCC Inline ASM GCC 支持在C/C++代码中嵌入汇编代码,这些汇编代码被称作GCC Inline ASM——GCC内联汇编。...我们来查看一下被放在example1.s中的编译结果,我们这里仅仅列出了使用gcc 2.96在redhat 7.3上编译后的相关函数部分汇编代码。为了保持清晰性,无关的其它代码未被列出。...在基本内联汇编中,“Instruction List”的书写的格式和你直接在汇编文件中写内联汇编没有什么不同,你可以在其中定义Label,定义对齐(.align n ),定义段(.section name...两种格式对寄存器语法的要求不同:基本格式要求寄存器前只能使用一个百分号(%),这一点和内联汇编相同;而带有C/C++表达式格式则要求寄存器前必须使用两个百分号(%%),其原因我们会在后面讨论。...__out指定的寄存器%eax,假如是__in1,那么GCC在Instruction List之前会插入指令movl address_of_in1, %eax,那么随后popl %eax指令就修改了%eax

    12.3K45

    __attribute__机制介绍

    __attribute__机制也很容易同GNU应用程序做到兼容。 GNU CC需要使用 –Wall,这是控制警告信息的一个很好的方式。下面介绍几个常见的属性参数。...6. instrumentation 也可用于在其它函数中展开的内联函数。从概念上来说,profiling调用将指出在哪里进入和退出内联函数。这就意味着这种函数必须具有可寻址形式。...如果函数包含内联,而所有使用到该函数的程序都要把该内联展开,这会额外地增加代码长度。如果要在C 代码中使用extern inline声明,必须提供这种函数的可寻址形式。...和GNU编译器的兼容性 __attribute__设计的非常巧妙,很容易作到和其它编译器保持兼容。也就是说,如果工作在其它的GNU编译器上,可以很容易的忽略该属性。...更多属性参考:http://gcc.gnu.org/onlinedocs/gcc-4.0.0/gcc/Function-Attributes.html 10.

    2.9K11

    重学计算机组成原理(六)- 函数调用怎么突然Stack Overflow了!

    ,继续执行call之后的指令,地球毕竟是圆的 有没有一个可以不跳回原来开始的地方,从而实现函数的调用呢 似乎有.可以把调用的函数指令,直接插入在调用函数的地方,替换掉对应的call指令,然后在编译器编译代码的时候...不过思考一下,你会发现漏洞 如果函数A调用了函数B,然后函数B再调用函数A,我们就得面临在A里面插入B的指令,然后在B里面插入A的指令,这样就会产生无穷无尽地替换。...3 利用函数内联实现性能优化 上面我们提到一个方法,把一个实际调用的函数产生的指令,直接插入到的位置,来替换对应的函数调用指令。...事实上,这就是一个常见的编译器进行自动优化的场景,我们通常叫函数内联(Inline) 只要在GCC编译的时候,加上对应的一个让编译器自动优化的参数-O,编译器就会在可行的情况下,进行这样的指令替换。...除了依靠编译器的自动优化,你还可以在定义函数的地方,加上inline的关键字,来提示编译器对函数进行内联

    26040

    GCC -O0 -O1 -O2 -O3 四级优化选项

    Gcc 将执行几乎所有的不包含时间和空间折中的优化。当设置 O2 选项时,编译器并不进行循环打开()loop unrolling 以及函数内联。...这种选项容易使代码速度变慢,原因是需要插入一些 dummy operations 当分支抵达 usual flow of the code. l -fcrossjumping:这是对跨越跳转的转换代码处理...在包含了 O2 所有的优化的基础上,又打开了以下优化选项: l -finline-functions:内联简单的函数到被调用函数中。由编译器启发式的决定哪些函数足够简单可以做这种内联优化。...O3 在 O2 的基础上进行更多的优化,例如使用伪寄存器网络,普通函数内联,以及针对循环的更多优化。 Os 主要是对代码大小的优化,我们基本不用做更多的关心。...例如:对分支的合并和消除,对公用子表达式的消除,对循环内 load/store 操作的替换和更改等,都将会使目标代码的执行顺序变得面目全,导致调试信息严重不足。

    3.9K30

    重学计算机组成原理(六)- 函数调用怎么突然Stack Overflow了!

    ,在计算机指令层面函数间的相互调用是怎么实现的,以及什么情况下会发生栈溢出 1 栈的意义 先看一个简单的C程序 function.c [在这里插入图片描述] 直接在Linux中使用GCC编译运行 [hadoop...不过思考一下,你会发现漏洞 如果函数A调用了函数B,然后函数B再调用函数A,我们就得面临在A里面插入B的指令,然后在B里面插入A的指令,这样就会产生无穷无尽地替换。...3 利用函数内联实现性能优化 上面我们提到一个方法,把一个实际调用的函数产生的指令,直接插入到的位置,来替换对应的函数调用指令。...事实上,这就是一个常见的编译器进行自动优化的场景,我们通常叫函数内联(Inline) 只要在GCC编译的时候,加上对应的一个让编译器自动优化的参数-O,编译器就会在可行的情况下,进行这样的指令替换。...除了依靠编译器的自动优化,你还可以在定义函数的地方,加上inline的关键字,来提示编译器对函数进行内联

    72400

    【C++】C++入门

    ,对于第二行来说,先插入b值,再插入空格,再插入c值,相当于C语言中的printf return 0; } 这里对于C++标准库的命名空间,使用using namespace std 可以全部展开...,我们选择在Linux下观察 结论:gcc函数修饰后名字不变,而g++的函数修饰变成 _Z+函数长度+函数名+类型首字母 也就是说,C语言没法支持重载,同名函数没办法区分,C++可以通过名字修饰的方式形成不同名字的函数...1、内联函数的概念 以关键字inline修饰的函数内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,提升程序运行的效率 2、内联函数的特性 (1)inline是一种空间换时间的做法...,如果函数被当做是内联函数处理,在编译阶段会用函数体替换函数调用,它可能会使目标文件变大,但它减少了调用的开销,提高了程序的运行效率 (2)inline对于编译器来说并不是命令而是一种建议,一般来说,函数规模较小...、不是递归且频繁调用的函数用inline修饰,否则会被编译器忽略 (3)inline不能够声明与定义分离,会导致链接错误,因为编译器需要看到内联函数的定义才能内联展开 C++中的内联函数对标C中的宏,宏的优点是增强代码的复用性以及提高性能

    14111

    【Linux Plumbers 大会总结】Rust 和 GCC 整合的两种方式

    他开始说,rustc编译器是基于LLVM的,除此之外,这意味着它不支持GCC所支持的所有体系结构。LLVM有的,rustc也有,但它有一个API,可以插入一个替代的代码生成器。...这个API可以用来通过`libgccjit`[4]插入GCC的代码生成机制。这就是 rustc_codegen_gcc 所采取的方法。 为什么这会是一件有用的事情呢?...rustc_codegen_gcc现在支持许多Rust特性,包括基本和聚合类型、变量、函数、原子类型、线程本地存储、内联汇编、许多内部函数等等。...未来的工作包括宏、导入、未稳定的特性和内部函数。有趣的是,目前的编译器可以构建 "hello world",但它需要使用Unsafe 的代码;缺乏宏意味着println!...()不可用,必须调用C语言的printf()函数来代替。 计划在未来进一步开展的工作包括借用检查器,这将与`Polonius`[7]项目合作完成。增量编译也在列表中,还有将前端移植到旧的GCC版本。

    99410

    LLVM的ThinLTO编译优化技术在Postgresql中的应用

    静态链接自然适用于LTO的概念,但它只适用于包含IR对象而不是包含机器码的库存档文件。由于性能问题,甚至不总是直接使用整个单元,可以将程序分割成类似GCC的WHOPR的分而治之的LTO形式。...这种模式使GCC假设正在编译的模块包含整个程序的入口点,因此其中的其他函数不会被外部使用,可以安全地进行优化。由于它适用于单个模块,因此无法真正涵盖整个程序。...ThinLTO是一种新的方法,旨在像LTO构建一样具有可扩展性,同时保留了完整LTO的大部分性能优势。 在ThinLTO中,串行步骤非常轻量且快速。...函数导入和其他IPO转换是在模块在完全并行的后端进行优化时执行的。 ThinLTO全局分析所启用的关键转换是函数导入,只有可能进行内联函数被导入到每个模块中。...索引文件后半部分保存了全局变量、函数的信息,包括自身的全局guid、所属bc的moduleid、函数的连接类型、可见性、能否内联、能否抛出异常等等信息。

    20110

    Win32 Linux汇编语法区别

    GCC内联汇编语句的指令部中,加上前缀’%'的数字(如%0,%1)表示的就是需要使用寄存器的”样板”操作数。...如果一个输入约束要求使用寄存器,则GCC在预处理时就会为之分配一个寄存 器,并插入必要的指令将操作数装入该寄存器。...在GCC内联汇编格式中的最后一个部分中,可以对将产生副作用的寄存器进行说明,以便GCC能够采用相应的措施。...· 内联汇编语句的最后一个部分告诉GCC它将改变寄存器eax中的值,GCC在处理时不应使用该寄存器来存储任何其它的值。...Linux提供了非常优秀的工具来支持汇编程序的开发,使用GCC内联汇编能够充分地发挥C语言和汇编语言各 自的优点 转载自http://bbs.fishc.com/home.php?

    2.4K40
    领券