What's the difference between a static inline
, extern inline
and a normal inline
function?
I've seen some vague explanations about this. As far as I've understood, static inline
is not just an inline
function that is meant to only be referred to within a certain file as the static
keyword usually means. The same goes for extern inline
too I guess, it's not the same explanation as with extern
variables. Any answers would be greatly appreciated!
Static inline functions are simple. Either a function defined with the inline function specifier is inlined at a reference, or a call is made to the actual function. The compiler can choose which to do at each reference. The compiler decides if it is profitable to inline at -xO3 and above.
Inline functions provide following advantages: 1) Function call overhead doesn't occur. 2) It also saves the overhead of push/pop variables on the stack when function is called. 3) It also saves overhead of a return call from a function.
#define __STATIC_INLINE. Define a static function that may be inlined by the compiler. Defines a static function that may be inlined by the compiler. If the compiler generates inline code for all calls to this functions, no additional function implementation is generated which may further optimize space.
A function definition with static inline
defines an inline function with internal linkage. Such function works "as expected" from the "usual" properties of these qualifiers: static
gives it internal linkage and inline
makes it inline. So, this function is "local" to a translation unit and inline in it.
A function definition with just inline
defines an inline function with external linkage. However, such definition is referred to as inline definition and it does not work as external definition for that function. That means that even though this function has external linkage, it will be seen as undefined from other translation units, unless you provide a separate external definition for it somewhere.
A function definition with extern inline
defines an inline function with external linkage and at the same time this definition serves as external definition for this function. It is possible to call such function from other translation units.
The last two paragraphs mean that you have a choice of providing a single extern inline
definition for an inline function with external linkage, or providing two separate definitions for it: one inline
and other extern
. In the latter case, when you call the function the compiler is allowed to chose either of the two definitions.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With