答案 0 :(得分:2)
inline
是C ++的关键字,但内联是由编译器后端执行的通用过程,通常在生成指令序列之后。
C编译器也将内联函数,C ++编译器将内联不是inline
的函数。由于任何原因,C ++编译器也无法内联inline
函数。关键字实际存在,用于指定函数在不同的转换单元(源文件)中可能具有多个相同的定义。
静态变量对是否可以内联某些内容没有特别的影响。也许有些编译器难以链接全局变量引用的结果结构,但这更像是一个错误而不是经验法则。
递归函数也可以内联。递归调用应该转换为分支。然后可以通过循环展开来锁定分支。
通常不会内联编译为超过一千字节代码的函数。但是编译器可能会提供#pragma
指令或特定于平台的属性来强制在这种情况下进行内联。
阻止函数内联的最大因素是在代码生成时编译器无法获得其源代码。链接时优化打开了内联extern
而不是inline
函数的可能性,但DLL提供的函数肯定是不受限制的。但是,您仍然可以通过JIT样式执行引擎运行它,并且可以内联(拼接)它喜欢的任何随机片段。
答案 1 :(得分:1)
函数不能的唯一情况是,如果编译单元中没有该函数的定义。即使这样也不会阻止链接时优化器的链接时间内联。
请注意,inline
关键字实际上只是一个提示 - 编译器可能选择不使用它来内联函数,并选择在没有它的情况下内联函数。