Choosing Which Functions to Inline

The compiler offers several methods to specify which functions are eligible for inlining.

To specify that a function is eligible to be inlined, precede its definition with the inline, __inline__, or __inline keyword. To allow these keywords in C source code, turn off ANSI Keywords Only in the CodeWarrior IDE's C/C++ Language settings panel or turn off the only_std_keywords pragma in your source code.

To verify that an eligible function has been inlined or not, use the Non-Inlined Functions option in the IDE's C/C++ Warnings panel or the warn_notinlined pragma. The following listing shows an example.

Listing: Specifying to the compiler that a function may be inlined

#pragma only_std_keywords off

inline int attempt_to_inline(void)

{

    return 10;

}

To specify that a function must never be inlined, follow its definition's specifier with __attribute__((never_inline)). The following listing shows an example.

Listing: Specifying to the compiler that a function must never be inlined

int never_inline(void) __attribute__((never_inline))

{

   return 20;

}

To specify that no functions in a file may be inlined, including those that are defined with the inline, __inline__, or __inline keywords, use the dont_inline pragma. The following listing shows an example.

Listing: Specifying that no functions may be inlined

#pragma dont_inline on

/* Will not be inlined. */

inline int attempt_to_inline(void)

{

    return 10;

}

/* Will not be inlined. */

int never_inline(void) __attribute__((never_inline))

{

   return 20;

}

#pragma dont_inline off

/* Will be inlined, if possible. */

inline int also_attempt_to_inline(void)

{

    return 10;

}

The kind of functions that never inlined are:

The compiler will not inline these functions, even if they are defined with the inline, __inline__, or __inline keywords.

The following functions also should never be inlined:

It can inline such functions if the class has a trivial empty constructor as in this case:

Listing: Class with trivial empty constructor

struct X {

    int n;

    X(int a) { n = a; }

    ~X() {}

};

inline X f(X x) { return X(x.n + 1); }

int main()

{

    return f(X(1)).n;

}

This does not depend on "ISO C++ templates".