Difference between revisions of "Inline"

From Lazarus wiki
(insert application)
 
(2 intermediate revisions by the same user not shown)
Line 1: Line 1:
 
{{inline}}
 
{{inline}}
  
 +
The [[modifier]] <syntaxhighlight lang="pascal" inline>inline</syntaxhighlight> requests the [[FPC]] to consider copying the definition of a [[Routine|routine]] to the call site.
  
Return to [[Reserved words]].
+
== use ==
 
+
The use of <syntaxhighlight lang="pascal" inline>inline</syntaxhighlight> routines is switched off by default.
 
+
You can enable it with the <syntaxhighlight lang="bash" inline>‑Si</syntaxhighlight> compiler switch or the <syntaxhighlight lang="delphi" inline>{$inline on}</syntaxhighlight> [[local compiler directives|local compiler directive]].
The reserved word '''inline''' allows the compiler to copy a function or procedure in place of its call.
+
The <syntaxhighlight lang="pascal" inline>inline</syntaxhighlight> directive is placed after a routine’s signature at its defining point.
 +
Example:
 +
<syntaxhighlight lang="pascal" highlight="1">
 +
function cube(const x: ALUSInt): ALUSInt; inline;
 +
begin
 +
cube := sqr(x) * x;
 +
end;
 +
</syntaxhighlight>
  
If the inline function or procedure is used frequently, this increases the speed of the program since the program does not have to branch to the subroutine.
+
== implications ==
 +
Inlining means that a routine’s implementation exists at ''multiple'' places in the final [[Executable program|executable file]].
 +
There is no single address the program jumps to, but every time you invoke that routine there is dedicated copy in the source code.
  
The use of inline functions and inline procedures is switched off as standard. The compiler switch '''-Si''' or '''{$inline on}''' enables the use of inline functions and procedures.
+
=== advantages ===
 +
* Avoid call overhead for frequently invoked routines. This ''could'' increase the speed of the program.
 +
* Elimination of an extra level of indirection in the case of [[Variable parameter|parameters passed by reference]].
  
{{Warning| inline is a compiler hint and the compiler can ignore it. If the compiler warns you it has not inlined a certain code part marked as inline, you should remove the inline directive. This is not a bug. It is about code complexity}}
+
=== disadvantages ===
 +
* More difficult to debug: There is no extra frame on the stack indicating the subroutine.
 +
* Inlining requires space. You will necessarily have numerous copies of the same code at many places.
 +
* It is not possible to “fine tune” the use of <syntaxhighlight lang="pascal" inline>inline</syntaxhighlight>: You cannot ask for inlining ''just'' at specific places (e.&#8239;g. in a loop).
  
 +
== caveats ==
 +
* <syntaxhighlight lang="pascal" inline>inline</syntaxhighlight> is a compiler ''hint''. The compiler can ignore it. If the compiler warns you it has not inlined a certain code part marked as <syntaxhighlight lang="pascal" inline>inline</syntaxhighlight>, you should remove the <syntaxhighlight lang="pascal" inline>inline</syntaxhighlight> directive. This is not a bug; it is about code complexity.
 +
* Recursive routines cannot be inlined.
 +
* Regardless of the <syntaxhighlight lang="pascal" inline>inline</syntaxhighlight> request ''there is'' one instance the routine exists in memory like usual.
  
Example:
+
== application ==
 +
# ''Generally'' speaking, ''never'' use <syntaxhighlight lang="pascal" inline>inline</syntaxhighlight>. According to Pascal’s “dogma” the programmer should not be concerned about such “internal” details. Any provision regarding memory or the generated code unnecessarily increases the complexity of your source code.
 +
# If you want to optimize for speed, consider [[Optimization|<syntaxhighlight lang="delphi" inline>{$optimization autoInline}</syntaxhighlight>]] first. In some decisions the compiler is smarter than you, because it has more information available. The automatic <syntaxhighlight lang="pascal" inline>inline</syntaxhighlight> optimization also relieves you from the burden of making that decision and manually maintaining it.
 +
# “Only” if ''you'' have ''more'' information than the compiler, you are “allowed” to insert <syntaxhighlight lang="pascal" inline>inline</syntaxhighlight>.
  
<syntaxhighlight lang=pascal>
+
== see also ==
procedure subDemo(); inline;
+
* [https://www.freepascal.org/docs-html/ref/refsu77.html <syntaxhighlight lang="pascal" inline>inline</syntaxhighlight>] in the FPC Reference Guide
  begin
+
* [https://www.freepascal.org/docs-html/prog/progsu36.html <syntaxhighlight lang="text" inline>$INLINE</syntaxhighlight>: Allow inline code] in the FPC Programmers’ Guide
  ...
 
  end;
 
</syntaxhighlight>
 

Latest revision as of 07:58, 19 August 2021

Deutsch (de) English (en)

The modifier inline requests the FPC to consider copying the definition of a routine to the call site.

use

The use of inline routines is switched off by default. You can enable it with the ‑Si compiler switch or the {$inline on} local compiler directive. The inline directive is placed after a routine’s signature at its defining point. Example:

function cube(const x: ALUSInt): ALUSInt; inline;
begin
	cube := sqr(x) * x;
end;

implications

Inlining means that a routine’s implementation exists at multiple places in the final executable file. There is no single address the program jumps to, but every time you invoke that routine there is dedicated copy in the source code.

advantages

  • Avoid call overhead for frequently invoked routines. This could increase the speed of the program.
  • Elimination of an extra level of indirection in the case of parameters passed by reference.

disadvantages

  • More difficult to debug: There is no extra frame on the stack indicating the subroutine.
  • Inlining requires space. You will necessarily have numerous copies of the same code at many places.
  • It is not possible to “fine tune” the use of inline: You cannot ask for inlining just at specific places (e. g. in a loop).

caveats

  • inline is a compiler hint. The compiler can ignore it. If the compiler warns you it has not inlined a certain code part marked as inline, you should remove the inline directive. This is not a bug; it is about code complexity.
  • Recursive routines cannot be inlined.
  • Regardless of the inline request there is one instance the routine exists in memory like usual.

application

  1. Generally speaking, never use inline. According to Pascal’s “dogma” the programmer should not be concerned about such “internal” details. Any provision regarding memory or the generated code unnecessarily increases the complexity of your source code.
  2. If you want to optimize for speed, consider {$optimization autoInline} first. In some decisions the compiler is smarter than you, because it has more information available. The automatic inline optimization also relieves you from the burden of making that decision and manually maintaining it.
  3. “Only” if you have more information than the compiler, you are “allowed” to insert inline.

see also