【问题标题】:The "inline" keyword in C++C++ 中的“内联”关键字
【发布时间】:2020-07-15 22:02:28
【问题描述】:

所以关键字“inline”会导致调用被函数体替换,对吗? 所以我猜这意味着我们完全跳过电话?就像我们查看 .asm 文件时找不到调用指令一样?

【问题讨论】:

  • inline 建议编译器考虑将其用于内联。如果它确实被内联,则对函数的所有调用都将替换为函数的主体。
  • 现代 C++ 编译器中 inline 的主要用途是避免违反 One Definition Rule
  • 视情况而定,如果大多数编译器未能inline 某事,则会发出警告。
  • @Taekahn 所以在汇编指令 lvl 中,我们没有看到任何调用指令对吗?
  • @ヅヅヅ 是的,IF 一个函数被内联,那么在调用该函数的位置没有使用调用指令。函数的实际主体代码直接插入调用站点,就好像没有函数存在一样。

标签: c++ function inline inline-assembly machine-code


【解决方案1】:

关键字inline 具有误导性——它既没有必要也没有足够的实际内联发生。它所做的一切:它告诉链接器允许函数的多个定义,这意味着您可以将函数放在头文件中。一旦你这样做了,编译器就有更好的内联机会,因为函数体在更多地方变得可见。在现代系统中,是否使用全代码优化已不再重要。

一旦编译器有机会内联,它就必须决定它是否有利于您要求它执行的任何优化(例如优化速度)。

如果编译器决定内联,那么你所说的 .asm 文件是正确的 - 没有调用函数。

【讨论】:

  • 所以这取决于优化的类型。知道了。谢谢!
  • @ヅヅヅ 更好的措辞是“它受到优化类型的影响。”编译器将查看一系列不同的指标,例如“内联函数会破坏指令缓存并花费更长的时间吗?”
【解决方案2】:

那么关键字“inline”会导致调用被函数体替换,对吗?

不正确。

所以我猜这意味着我们完全跳过了通话?就像我们查看 .asm 文件时找不到调用指令一样?

是的,如果编译器内联扩展函数调用,那么确实不会有函数调用。

但是inline关键字并不意味着对函数的调用保证会被内联扩展。

【讨论】:

    猜你喜欢
    • 2011-05-17
    • 1970-01-01
    • 2015-01-18
    • 1970-01-01
    • 2011-07-05
    • 1970-01-01
    • 1970-01-01
    • 2015-04-17
    • 1970-01-01
    相关资源
    最近更新 更多