【问题标题】:is this function considered for inline?这个函数是否考虑内联?
【发布时间】:2011-11-17 02:03:18
【问题描述】:
#include <stdio.h>

static void test()
{
    printf("is this function considered for inline?");
}

int main()
{
    test(); // definition does not have inline keyword. But declaration at the bottom (which is never used) has a inline keyword.
}

inline static void test(); // definition WITH inline keyword

编译器是否会将test() 视为附加了inline 关键字?

编辑:对不起,我的意思是在最后的声明中有一个内联关键字!

【问题讨论】:

  • 你编译时是否开启了优化?你的示例代码中的最后一行是什么 - 甚至不会编译
  • 我认为不可能知道,也许是为了拆卸它。你需要它是有原因的,还是只是出于好奇?只是出于好奇。
  • 很抱歉,我的示例代码中有一个巨大的错误。我的意思是在声明的末尾有一个 inline 关键字!
  • 那么,是不是说使用 inline 关键字连构建内核都没用?
  • @KerrekSB 我只是在谈论优化目的,而不是 inline 这个词的其他功能,例如模板和 ODR。我的意思是编译器可能已经非常清楚它想要内联的内容,并且为了内联它们而没有过多考虑inline 声明的函数。有了这个澄清,我说的还是不正确的吗?

标签: c gcc inline declaration


【解决方案1】:

用 gcc -S 编译,看看汇编器是什么样子的,例如这是一个 -O2 - 所以我们可以看到 test() 已经消失并内联了。你应该有一个由 gcc 生成的 .s 文件

main:
.LFB12:
  .cfi_startproc
  movl  $.LC0, %edi
  xorl  %eax, %eax
  jmp   printf
  .cfi_endproc
.LFE12:

如果没有优化,我们可以看到对 test() 的调用

main:
.LFB1:
  .cfi_startproc
  pushq %rbp
  .cfi_def_cfa_offset 16
  .cfi_offset 6, -16
  movq  %rsp, %rbp
  .cfi_def_cfa_register 6
  movl  $0, %eax
  call  test
  popq  %rbp
  .cfi_def_cfa 7, 8
  ret
  .cfi_endproc
.LFE1:

【讨论】:

    【解决方案2】:

    最好的方法是查看程序集。

    让 GCC 考虑每个函数进行内联的编译器标志是-finline-functions。默认情况下,-O3 启用。

    所以在-O3,GCC 将考虑每个函数进行内联,即使没有用inline 声明。

    【讨论】:

    • 很抱歉,我的示例代码中有一个巨大的错误。我的意思是在声明的末尾有一个 inline 关键字!它极大地改变了问题的上下文。
    • 这很模棱两可。最好的方法是在-O2 下测试它,看看会发生什么。该文档没有提及有关此排序的任何内容。 (gcc.gnu.org/onlinedocs/gcc/Inline.html)
    • 是的,即使是标准也没有提到任何关于这种歧义的内容(它提到了具有外部链接的函数,但没有提到任何关于静态函数的内容)。
    • 我不知道你为什么要这样做。但最明确的方法是在第一个声明时声明内联,如果没有声明,则声明定义本身。
    【解决方案3】:

    inline 关键字用词不当,并不能说明函数何时有效内联。如果将它添加到 definition 中,它只是确保当将此定义放在头文件中时,不同编译单元(.o 文件)中的“多个符号”不会出现问题。不要寻求更多。

    函数是否有效内联完全取决于编译器。如果产生了外部符号(您的static 定义),这甚至无关紧要。大多数编译器都有扩展来规范这一点(例如 gcc 的__attribute__((always_inline))),唯一知道的方法是检查生成的汇编程序或对象。

    【讨论】:

      猜你喜欢
      • 2017-08-15
      • 1970-01-01
      • 2016-10-17
      • 1970-01-01
      • 1970-01-01
      • 2014-07-05
      • 1970-01-01
      • 2022-01-16
      • 1970-01-01
      相关资源
      最近更新 更多