One of my recent program highly depends on inlining a few "hot" functions for performance. These hot functions are part of an external .c
file which I would prefer not to change.
Unfortunately, while Visual is pretty good at this exercise, gcc and clang are not. Apparently, due to the fact that the hot functions are within a different .c
, they can't inline them.
This leaves me with 2 options :
#include "perf.c"
instead of #include "perf.h"
. Trivial change but it looks ugly. Clearly it works. It's just a little bit more complex to explain to the build chain that perf.c
must be there but not be compiled nor linked.Use -flto
, for Link Time Optimisation. It looks cleaner, and is what Visual achieves by default.
The problem is, with -flto
, gcc linking stage generates multiple warnings, which seem to be internal bugs (they refer to portion of code from within the standard libs, so I have little control over them). This is embarrassing when targeting a "zero warning" policy (even though the binary generated is perfectly fine).
As to clang, it just fails with -flto
, due to packaging error (error loading plugin: LLVMgold.so) which is apparently very common accross multiple linux distros.
2 questions :
-flto
on gcc ?According to your comment you have to suport gcc 4.4. As LTO started with gcc 4.5 (with all caution about early versions), the answer should be clearly. no -flto
.
So, #include
the code with all due caution, of course.
Update:
The file-extension should not be .c
, though, but e.g. .inc
(.i
is also a bad idea). Even better: .h
and change the functions to static inline
. That still might not guarantee inlining, but that's the same as for all functions and it maintains the appearance of a clean header (although a longer inline
function still is bad style).
Before doing all this, I'd properly profile, if the code really has a problem. One should concentrate on writing readable and maintainable code in the first place.