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

编译器如何决定是否值得使我的函数内联?

编译器决定是否值得将函数内联的过程称为内联函数优化。编译器会根据一定的规则和优化策略来决定是否将函数内联。以下是一些关键因素,可以影响编译器的决策:

  1. 函数体积:如果函数体积较小,编译器更可能将其内联。内联函数可以减少函数调用的开销,提高代码执行效率。
  2. 递归函数:递归函数通常不会被内联,因为递归调用可能导致大量的重复代码,从而增加程序的内存占用和执行时间。
  3. 循环中的函数:在循环体内调用的函数也可能被内联。这样可以减少循环中的函数调用开销,提高代码执行效率。
  4. 函数属性:编译器可能会根据函数的属性来决定是否内联。例如,如果函数具有“inline”属性,编译器可能更倾向于将其内联。
  5. 编译器优化级别:编译器的优化级别也会影响其决策。较高的优化级别可能会导致编译器更倾向于内联函数,以提高代码执行效率。
  6. 目标平台:编译器会根据目标平台的特性来决定是否内联函数。例如,在资源受限的平台上,编译器可能更倾向于减少内联,以减少程序的内存占用。

总之,编译器决定是否值得将函数内联取决于多种因素。编译器会根据这些因素以及优化策略来决定是否将函数内联,以提高代码执行效率和减少内存占用。

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

相关·内容

C++内联函数

内联函数收到编译器指示时,即可发生内联编译器将使用函数定义体来替代函数调用语句,这种替代行为发生在编译阶段而非程序运行阶段。...值得注意是,内联函数仅仅是对编译器内联建议,编译器是否觉得采取你建议取决于函数是否符合内联有利条件。如何函数体非常大,那么编译器将忽略函数内联声明,而将内联函数作为普通函数处理。...如何使函数内联 定义函数时,在函数最前面以关键字“inline”声明函数,即可使函数称为内联声明函数。...例如在计算1~1000以内素数时,我们经常会使用开方操作使运算范围缩小,这时我们会写一个函数: int root(int n) {   return (int)sqrt((float)n); } 然后我们求范围内素数函数可以这样写...关键点 内联声明只是一种对编译器建议,编译器是否采用内联措施由编译器自己来决定。甚至在汇编阶段或链接阶段,一些没有inline声明函数编译器也会将它内联展开。

60420

【C++】内联函数 ③ ( C++ 编译器 不一定允许内联函数内联请求 | 内联函数优缺点 | 内联函数 与 宏代码片段对比 )

; 内联函数 优点 是 可以减少函数调用开销,提高程序执行效率 ; 内联函数 缺点 是 会增加代码大小 , 会降低程序性能 ; 因此,编译器决定 " 内联函数 " 是否 内联时 , 会进行权衡...内联带来性能提升 和 代码大小增加开销 ; 3、是否内联决定权在编译器手中 是否内联决定权在编译器手中 : 在 C++ 语言中,inline关键字只是对编译器建议,编译器可以根据自己 优化策略...自由决定是否内联函数 ; 在 普通函数 声明和定义 位置 前面加上 inline 关键字 , 只是 建议 C++ 编译器将该函数内联 , 并不强制要求编译器内联函数 , 如果编译器决定内联函数 ,...该 内联函数 作用 等同于 普通函数 ; 最终 内联函数 是否内联成功 , 由 编译器 决定 ; 二、内联函数 与 宏代码片段对比 1、内联函数 " 内联函数 " 本质是 函数 , 其是一种 特殊函数...只是请求 C++ 编译器 将 该函数进行内联 , 具体 C++ 是否同意 , 需要根据 C++ 编译器优化策略决定 , 可能同意 , 也可能不同意 ; 如果 C++ 编译器 不同意 内联请求 , 则该

20420
  • C++从入门到精通——内联函数

    在C++中,可以使用inline关键字声明内联函数。然而,编译器对于是否真正内联一个函数有最终决定权,即使函数被声明为内联编译器也可以选择不进行内联。...减少函数调用带来代码膨胀:函数调用会导致代码中出现大量跳转指令,而内联函数代码直接嵌入到调用地方,可以减少跳转指令数量,使代码更加紧凑。...内联函数概念 以inline修饰函数叫做内联函数,编译时C++编译器会在调用内联函数地方展开,没有函数调用建立栈帧开销,内联函数提升程序运行效率。...如果在上述函数前增加inline关键字将其改成内联函数,在编译期间编译器会用函数体替换函数调用。...二、内联函数查看方式 在release模式下,查看编译器生成汇编代码中是否存在call Add 在debug模式下,需要对编译器进行设置,否则不会展开(因为debug模式下,编译器默认不会对代码进行优化

    13410

    C++常见面试知识点

    static 作用 1,修饰普通变量,修改变量存储区域和生命周期,使变量存储在静态区,在main函数运行钱就分配了空间,如果有初始值就用初始值初始化它,如果没有就用默认值初始化。...3,修饰成员变量,修饰成员变量使所有的对象只保存一个该变量,而且不需要生成对象就可以访问该成员。...inline 内联函数特征 相当于把内联函数里面的内容写在调用内联函数处; 相当于不用执行进入函数步骤,直接执行函数体; 相当于宏,却比宏多了类型检查,真正具有函数特性; 编译器一般不内联包含循环、...递归、switch 等复杂操作内联函数; 在类声明中定义函数,除了虚函数其他函数都会自动隐式地当成内联函数。...inline函数改变需要重新编译,不像 non-inline 可以直接链接。是否内联,程序员不可控。内联函数只是对编译器建议,是否函数内联决定权在于编译器

    76621

    哪些因素影响Java调用性能?

    不能确定这一改变是否会导致性能下降,但当我决定将此暂时搁置一边,试着寻找在这个讨论里是否有人公布过任何相关完整基准测试(sane benchmarks)时,结果空手而归。...基准测试方法论 决定选用一个相当不错框架 —— JMH 来构建基准测试。...现在,想知道哪些因素影响了Java方法调用性能。所以我决定以不同方式调用方法,并测算它们性能开销。...动物世界:多态是如何表现 先前提到调用点这一概念时,偷偷地回避了一个相当重要问题——因为在子类中可以重写一个非 final 方法,这使得调用点可以调用不同方法。...现假设传入一个 Foo 实例或一个重写了 bar 子类—— Baz实例,编译器如何得知要调用哪一个 bar 方法呢?在默认情况下,方法将在Java中被虚拟化(可重写)。

    94110

    【C++】内联函数 ④ ( C++ 编译优化 - 没有 inline 关键字修饰函数也可能被内联 | C++ 编译器内联限制 | 内联失败几种情况 )

    一、C++ 编译优化 - 没有 inline 关键字修饰函数也可能被内联 1、函数内联不确定性 现在 C++ 编译器能够进行编译优化 , 使用了 inline 声明 内联函数 , 编译器 可能不会允许该函数...进行内联 ; 没有使用 inline 声明 普通函数 , 如果频繁调用 , 编译器 可能会为了提高执行效率 , 将其内联 ; 内联函数不确定性 : 编译器内联函数是基于 编译器优化策略和代码特性...来决定 ; 不能保证所有函数都会被内联 ; 即使函数内联 , 也不能保证 程序性能 一定会提高 ; 2、C++ 编译器内联优化 简单且频繁调用函数 内联大概率成功 , 复杂函数 大概率内联失败...关键字修饰函数 , C++编译器 根据 函数特性 和 调用频率 , 结合当前 程序执行效率 和 综合性能 , 决定是否函数进行内联 ; 内联函数目的是减少函数调用开销 , 提高程序执行效率...; 编译器决定是否内联函数时 , 会考虑函数复杂性 , 大小和调用次数等因素 ; 如果 函数比较简单 且被频繁调用 , 编译器可能会选择将其内联 , 以提高程序执行效率 ; 二、C++ 编译器内联限制

    30230

    C++必知必会之基础知识-常用关键字(1)

    ::foo() { // 函数代码 } 编译器决策:inline关键字只是向编译器发出了一个请求,请求将函数内容内联到调用点。...编译器会自行决定是否真正内联展开函数代码,它可能会考虑函数复杂性、调用频率等因素来作出最优决策。...定义位置:通常将内联函数定义放在头文件中,因为在每个调用点都需要展开函数代码,编译器需要知道函数实现细节。 不支持递归:内联函数不支持递归调用,因为递归调用无法在调用点展开。...在调用MathUtil::add(5, 3)时,编译器会尝试在调用点展开add函数代码,从而减少函数调用开销。 需要注意是,虽然内联函数可以提高性能,但并不是所有的函数都适合内联。...适当地使用内联函数是一种优化手段,应该根据实际情况和性能测试来决定是否使用内联

    20340

    C++之内联函数

    大家好,又见面了,是全栈君   C++继承C一个重要特性是效率,在C中保护效率一个方法是使用宏(macro),宏实现是使用预处理器而不是编译器,预处理器直接用宏代码替换宏调用,所以就没有了参数压栈...内联函数编译器   内联函数使用inline关键字定义,为了使之有效,必须使函数体和声明结合在一起,否则,编译器将它作为普通函数对待   一般应该把内联定义在头文件中,当编译器看到这个定义时,它把函数类型...(函数名+返回值)和函数体放到符号表里,当使用函数时,编译器检查以确保调用和返回是否正确,然后将函数调用替换为函数体,因而消除了开销,内联代码的确占用空间,但假如函数较小,这实际比为了一个普通函数调用而产生代码...,编译器也不能执行内联,因为这时编译器必须为函数代码分配内存从而为我们产生一个函数地址。...我们必须理解内联仅仅是编译器一个建议,编译器不强迫内联任何代码,一个好编译器将会内联,简单函数,同时明智忽略那些太负责内联 2.

    34710

    影响Java调用性能有哪些因素

    不能确定这一改变是否会导致性能下降,但当我决定将此暂时搁置一边,试着寻找在这个讨论里是否有人公布过任何相关完整基准测试(sane benchmarks)时,结果空手而归。...基准测试方法论 决定选用一个相当不错框架 —— JMH 来构建基准测试。...现在,想知道哪些因素影响了Java方法调用性能。所以我决定以不同方式调用方法,并测算它们性能开销。...我们在JMH中可以借由 CompilerControl 注释控制一个方法是否内联。关于内联缓存概念,稍后再来说明。...现假设传入一个 Foo 实例或一个重写了 bar 子类—— Baz实例,编译器如何得知要调用哪一个 bar 方法呢?在默认情况下,方法将在Java中被虚拟化(可重写)。

    749100

    C++之内联函数

    2.内联函数特性 (1)内联函数是一种以空间换时间做法 用函数体替换函数调用 (2) inline(内联函数)对编译器而言只是个建议,但是编译器不一定会采纳这个建议。...inline是建议编译器将 inline修饰函数展开,但根据不同情况编译器具体决定是进行展开还是函数调用。...如何观察编译器是否内联函数进行进行展开?...答: 1.在release模式下,查看编译器生成汇编代码中是否存在call Add 2.在debug模式下,需要对编译器进行设置,否则不会展开。...设置以后进行调试,转到汇编代码,就可以观察该内联函数在程序运行过程中是否被展开。 debug模式下,编译器默认不会对代码进行优化(方便调试),以下给出vs2013环境下设置方式。

    58320

    绝对干货 | Kotlin内联类工作原理及使用案例,看完你会回来谢

    最后,您可以看到box_impl和unbox_impl函数,可能如您所期望,它们目的在于拆装箱操作。现在,让我们看看在代码中如何使用内联类。...) 为了使这两种take方法在JVM字节码中可用并避免签名冲突,编译器将第一个方法重命名为take-hqTGqkw之类东西。...请记住,内联类以及原始类型特定用法通常都依赖于此技术,因此可能必须重新考虑是否该这么做。 使用案例 我们看到内联类具有巨大优势:在最佳情况下,由于避免了额外堆分配,它们可以大大减少运行时开销。...但是,一个重要区别是getParsed_impl函数,该函数表示已解析可计算属性。如您所见,该函数被实现为静态函数,该静态函数接受字符串并返回BigDecimal。那么在调用者代码中如何利用呢?...由于内联类仍处于Alpha阶段,因此您必须接受未来代码会由于其行为更改而在将来版本中失效。这一点我们要记住。不过,认为现在就开始使用它们是有合理。 ?

    58320

    绝对干货 | Kotlin内联类工作原理及使用案例,看完你会回来谢

    最后,您可以看到box_impl和unbox_impl函数,可能如您所期望,它们目的在于拆装箱操作。现在,让我们看看在代码中如何使用内联类。...) 为了使这两种take方法在JVM字节码中可用并避免签名冲突,编译器将第一个方法重命名为take-hqTGqkw之类东西。...请记住,内联类以及原始类型特定用法通常都依赖于此技术,因此可能必须重新考虑是否该这么做。 使用案例 我们看到内联类具有巨大优势:在最佳情况下,由于避免了额外堆分配,它们可以大大减少运行时开销。...但是,一个重要区别是getParsed_impl函数,该函数表示已解析可计算属性。如您所见,该函数被实现为静态函数,该静态函数接受字符串并返回BigDecimal。那么在调用者代码中如何利用呢?...由于内联类仍处于Alpha阶段,因此您必须接受未来代码会由于其行为更改而在将来版本中失效。这一点我们要记住。不过,认为现在就开始使用它们是有合理

    1.3K30

    谷歌提出用于编译器优化机器学习框架 MLGO

    1 MLGO是如何工作内联(Inlining)有助于通过做出能够删除冗余代码决策来减少代码大小。...在下面的示例中,调用者函数 foo()调用被调用者函数 bar(),而 bar()本身又调用了 baz()。内联这两个调用站点将返回一个简单 foo()函数,该函数将减小代码大小。...在内联阶段,编译器遍历(traverses)所有调用者-被调用者对调用图,并决定是否内联一个调用者-被调用者对。这是一个连续决策过程,因为以前内联决策会改变调用图,影响后面的决策和最终结果。...在MLGO之前,内联/非内联决定是由启发式方法做出,随着时间推移,这种方法越来越难以改进。MLGO用一个机器学习模型代替了启发式方法。...在调用图遍历过程中,编译器通过输入图中相关特征(即输入)来寻求神经网络对是否内联特定调用者-被调用者对建议,并按顺序执行决策,直到遍历整个调用图为止。

    75820

    基于Golang逃逸分析(Language Mechanics On Escape Analysis)

    特别地,编译器执行静态代码分析,以确定一个构造体实例化值是否会逃逸到堆。在 Go 语言中,你没有可用关键字或者函数,能够直接让编译器做这个决定。只能够通过你写代码方式来作出这个决定。...go:noinline 指令,阻止在 main 函数中,编译器使用内联代码替代函数调用。...内联(优化)会使函数调用消失,并使例子复杂化。将在下一篇博文介绍内联造成副作用。 在表 1 中,你可以看到创建 user 值,并返回给调用者两个不同函数。在函数版本 1 中,返回值。...在构建一个值时,使用值语义,并利用 & 操作符可读性来明确值是如何被共享编译器报告(Compiler Reporting) 想查看编译器(关于逃逸分析)决定,你可以让编译器提供一份报告。.../main.go:12: main &u2 does not escape 你可以看到编译器报告是否需要逃逸处理决定编译器都说了什么呢?

    81820

    CC++中inline用法详解

    inline int min(int first, int secend) {/****/};         inline函数编译器而言必须是可见,以便它能够在调用点内展开该函数。...这个细节虽然不会影响函数功能,但是体现了高质量C++/C 程序设计风格一个基本原则:声明与定义不可混为一谈,用户没有必要、也不应该知道函数是否需要内联。...所以不要随便地将构造函数和析构函数定义体放在类声明中。 一个好编译器将会根据函数定义体,自动地取消不值得内联(这进一步说明 了inline 不应该出现在函数声明中)。...让我们看看C++ "函数内联"是如何工作。 对于任何内联函数编译器在符号表里放入函数声明(包括名字、参数类型、返回值类型)。...如果编译器没有发现内联函数存在错误,那么该函数代码也被放入符号表里。 在调用一个内联函数时,编译器首先检查调用是否正确 (进行类型安全检查,或者进行自动类型转换,当然对所有的函数都一样)。

    1.8K30

    为什么泛型会让你Go程序变慢

    使通用代码更快 所以,作为一个致力于提高大型 go 服务性能的人,承认对 go 泛型并不特别兴奋,真的。对单态化感到兴奋,也对 go 编译器有可能进行优化感到兴奋,因为它在处理接口时根本做不到。...为了让回调在迭代器中被内联,我们必须用我们特定回调实例化一个 ForEachRune 副本。但是Go编译器不会这么做。任何明智编译器都不会为一个函数生成一个以上实例。除非......约束不一定需要是一个接口,这是值得记住 至于这个优化尝试结果,不打算在这里包括二进制汇编,但如果你一直跟到现在,你可能已经猜到这没有任何作用了。被实例化通用函数形状对我们回调来说并不特别。...实例化泛型将过于粗糙,无法进行任何优化 最后,让指出,尽管这个完全单态化例子可能不是在所有情况下都可靠,但它确实暗示了一些非常有希望事情:Go 编译器内联方面已经变得非常好,如果它能够处理非常具体代码实例...C++ 模板实例化糟糕性能特征是否也适用于 Go 编译器,因为它优化传递要少得多,而且有一个干净模块系统,可以防止大量冗余代码产生?

    30830

    JVM 方法内联

    内联函数就是在程序编译时,编译器将程序中出现内联函数调用表达式用内联函数函数体来直接进行替换。...内联函数处理方式与宏类似,但与宏又有所不同,内联函数拥有函数本身特性(类型、作用域等等)。在C++里有个内联函数,使用inline关键字修饰。...另外,写在Class定义内函数也会被编译器视为内联函数。 3. JVM内联函数 C++是否内联函数由自己决定,Java由编译器决定。...Java不支持直接声明为内联函数,如果想让他内联,你只能够向编译器提出请求: 关键字final修饰 用来指明那个函数是希望被JVM内联,例: public final void doSomething...() { // to do something } 总的来说,一般函数都不会被当做内联函数,只有声明了final后,编译器才会考虑是不是要把你函数变成内联函数

    1.4K40

    编程语言Zig有什么与众不同

    因此,我们需要用编译器内联函数 @TypeOf 在编译时生成返回类型,比如用 @TypeOf(a) 在编译时确定参数 a 类型,或者是用来指定返回变量 result 类型: fn maximum(a...,但还有别的问题: 没有限制用非数字参数调用 maximum 情况 如果 b 值更大,那么返回值会有会超出 @TypeOf(a) 范围情况 要想检测 a 和 b 类型是否正确,我们可以创建一个在编译时运行函数来检测参数是否是数字...void { assertNumber(bool); } 在这个函数定义中另一个值得关注点是 @compileError ,一个用来将编译器错误信息返回给用户编译时内联函数。...来标记参数类型,以告知 Zig 这些输入在编译时必须已知,编译器内联函数 @typeInfo 用于在编译时返回用于描述类型复合对象 info,其中包含了类型是否带符号,类型需要多少比特来表示信息...switch 语句表示得不是很清楚,让再解释下。

    3.4K20

    令人沮丧C++性能调试

    在本文中,我们将探讨 C++ 抽象模型如何严重依赖编译器优化,并揭示一些导致意外性能损失例子。...也许我们可以发明一些类似 [[no_unique_address]] 结合 [[gnu::always_inline]] 属性或向后兼容关键字来强制编译器始终内联有标记函数,不需要为它们生成代码。...目前还没有具体想法,不过这可能是一个值得探索方向。 编译器可以在处理这些函数方式上变得更聪明一些,它们确实正在朝着这个方向发展!...必须说,看到 GCC 和 Clang 维护人员逐步改进调试性能,感到非常高兴,也非常感谢他们。 无论如何不认为硬编码函数是正确解决方案。...此外,它们可以将简单包装器函数标记为 [[gnu::always_inline]] 或一个等效内置属性,强制编译器内联它们。 不幸是,libc++ 维护者并不喜欢这些想法。

    1K20

    C++学习过程中一些值得注意小点(1)

    一、内联函数 1.1内联函数定义 以inline修饰函数叫做内联函数,编译时C++编译器会在调用内联函数地方展开,没有函数调用建立栈帧开销,内联函数提升程序运行效率。...call指令表明Add函数在被调用时候建立了栈帧。如果在上述函数前增加inline关键字将其改为内联函数,在编译期间编译器会用函数体替换函数调用。...1.2.2缺点 inline是一种以空间换时间做法,如果编译器函数当成内联函数处理,在编译阶段会用函数体替换函数调用,但这种做法缺陷就是可能会使目标文件变大,导致文件在网络传输过程中传输速度变慢...但我们其实也不必担心,因为现在编译器已经十分“聪明”了。lnline说明只是向编译器发出一个请求,是否函数定义为内联函数还是取决于编译器自己判断。...二、类和对象中值得注意一些小点 1.在C++中,类型就是类名,在定义变量时变量名前不需要加struct 2.struct默认访问限定符为public,class默认访问限定符为private。

    7710
    领券