Franck Freiburger
Franck Freiburger

Reputation: 28448

locally disable function inlining

I need to make the compiler to not inline an inlined function. eg:

I have an inline function A.

I have a function B that calls A.
In B, A is inlined and this is perfect.

Now I have a function C that calls A many times.
In C, A is inlined, and it is not good.

Is it possible to tell the compiler to not inline A when it is called from C ?

--edit--

The first Idea is to create the function __declspec(noinline) A1 (that simply calls A) and call A1 instead of A in C.
But I wondering if there is a more elegant solution ?

note
I know that inline is only a suggestion, but in my program, I have some unlikely or error cases where the compiler inline functions but should not because in these cases I prefer function calls to reduce code size. I also noticed that the compiler is not always able to make the best choice (in the point of view of the developer)

Upvotes: 3

Views: 7687

Answers (4)

Franck Freiburger
Franck Freiburger

Reputation: 28448

I have found the following solution:

template <class F> ALWAYS_INLINE F NOINLINE( F f ) {

  return f;
}

It seems that the compiler (MSVC at least) don't inline functions called like this:

NOINLINE(my_inline_function)();

I think it is similar to the "calling it through a function pointer" solution from Nick D

Upvotes: 1

mbq
mbq

Reputation: 18628

Inlining is only a suggestion to compiler -- it is quite possible that the function won't be pasted in the second case. I would just trust the compiler and leave it as is.

Upvotes: 4

BjoernD
BjoernD

Reputation: 4780

In general, you cannot tell your compiler to inline or not inline a function. This is an internal optimization and even if you declare a function inline, the compiler may chose to not do so.

Some compilers allow you to control inlining to some extent. For instance, GCC has a function attribute noinline that prevents it from being inlined.

In your case, I'd try something like this:

inline void a() { ... }

void __attribute__((noinline)) wrap_a()
{ a(); }

void b() {  a(); }

void c() { wrap_a(); }

Upvotes: 8

Šimon T&#243;th
Šimon T&#243;th

Reputation: 36433

The most straight forward solution is to put the function code into a separate file.

Upvotes: 0

Related Questions