什么时候不能内联函数?

时间:2012-11-18 07:35:28

标签: c++ function inline

  

可能重复:
  When to use inline function and when not to use it?

在什么条件可以(不应该)函数没有内联(仅限C ++)?

know的两个条件是:

1。如果函数有递归调用

2。如果函数中有静态变量

2 个答案:

答案 0 :(得分:2)

inline是C ++的关键字,但内联是由编译器后端执行的通用过程,通常在生成指令序列之后。

C编译器也将内联函数,C ++编译器将内联不是inline的函数。由于任何原因,C ++编译器也无法内联inline函数。关键字实际存在,用于指​​定函数在不同的转换单元(源文件)中可能具有多个相同的定义。

静态变量对是否可以内联某些内容没有特别的影响。也许有些编译器难以链接全局变量引用的结果结构,但这更像是一个错误而不是经验法则。

递归函数也可以内联。递归调用应该转换为分支。然后可以通过循环展开来锁定分支。

通常不会内联编译为超过一千字节代码的函数。但是编译器可能会提供#pragma指令或特定于平台的属性来强制在这种情况下进行内联。

阻止函数内联的最大因素是在代码生成时编译器无法获得其源代码。链接时优化打开了内联extern而不是inline函数的可能性,但DLL提供的函数肯定是不受限制的。但是,您仍然可以通过JIT样式执行引擎运行它,并且可以内联(拼接)它喜欢的任何随机片段。

答案 1 :(得分:1)

函数不能的唯一情况是,如果编译单元中没有该函数的定义。即使这样也不会阻止链接时优化器的链接时间内联。

请注意,inline关键字实际上只是一个提示 - 编译器可能选择不使用它来内联函数,并选择在没有它的情况下内联函数。