一些搜索将内联代码定义为"添加/写入程序体"的代码。
但是很明显,内联代码不只是你写的那些手工添加/写入程序体的代码。当您在源代码文件中键入代码时。
内联代码的非二义定义是什么?
我的猜测是,行源代码,得到由编译器自动更换与其他指令线(因此在线)。然而,它的代码被替换或取代的代码?
典型的"是指函数/子程序(我将交替使用这两个术语)。
函数通常是一段单独的代码,被"调用"。(或从其他地方"调用"),并且"返回"。在执行完成后返回调用它的地方。然而,"calling"one_answers";returning"需要时间。时间不多,但如果一个函数被频繁调用,时间就会累积起来。
通常编译器会翻译"one_answers";returning"将操作转换为低级语言(通常是字节码或机器码)中可比较的操作。然而,有些语言提供了将函数标记为"inline";编译器将不会生成"调用"one_answers";returning"指令,而不是用` ` `调用` `;指令带有整个函数体,避免了函数调用的开销。一些语言/编译器不需要程序员显式地将函数标记为"内联",因为它们可以自动检测频繁调用的函数,并将其作为优化工作的一部分。在一个超级简化的示例中,使用伪代码:
源代码:
"Square of x" means "result of multiplication of x and x".
For each i from 1 to 10 print square of x.
For each i from 10 to 1 print square of x.
将代码(未优化版本)翻译成较低级别的语言(仍然是伪代码):
"Square of x" means "result of multiplication of x and x".
Let i be 1.
While i is less or equal than 10:
Let s be the square of x.
Print s.
Increment i.
Let i be 10.
While i is greater or equal than 1:
Let s be the square of x.
Print s.
Decrement i.
翻译后的代码(内联版本):
Let i be 1.
While i is less than 10:
Let s be the result of multiplication of x and x.
Print s.
Increment i.
Let i be 10.
While i is greater or equal than 1:
Let s be the result of multiplication of x and x.
Print s.
Decrement i.
第一个"翻译"代码段中,执行环境必须记住在循环的每一次循环中,x
的平方是多少。的意思。在第二次"翻译"中片段,"square"因为它是内联的,所以它本身从未被提及,我们不必浪费时间去弄清楚它的含义。
为什么不总是内联函数,如果它更快?因为如果调用不只是在一个地方,内联就会增加翻译(可执行)代码的大小,因为您需要将整个函数体放在调用它的任何地方。此外,还有一些内联无法完成的问题(或者至少在没有大量重组代码的情况下无法完成),例如当函数调用自身时(例如,您需要将函数的一部分替换为函数的整个体,这就像蛇试图吞下自己的身体:不可能完全完成)。
Tl;dr:对于"内联代码"的简洁定义,我最好的尝试可能是"在编译过程中用函数体替换函数调用的结果"。另一方面,"源代码"是"可以由解释器直接执行的代码文本"。或"尚未经过编译的代码文本"。