160 votes

Comment puis-je demander à gcc de ne pas incorporer une fonction?

Dire que j'ai cette petite fonction dans un fichier source

static void foo()
{

}

et je de construire une version optimisée de mon binaire mais je ne veux pas de cette fonction inline (pour des raisons d'optimisation). est-il une macro que je peux ajouter un code source pour éviter l'in-lining?

merci

183voto

alex tingle Points 3134

Vous voulez l' gcc-spécifique noinline d'attribut.

Cette fonction empêche un attribut la fonction d'être considéré pour inline. Si la fonction n'a pas ont des effets secondaires, il y a optimisations autres que l'in-lining qui causes des appels de fonction pour être optimisé loin, bien que l'appel de la fonction est vivre. Pour garder de tels appels de optimisé loin, a mis asm ("");

L'utiliser comme ceci:

void __attribute__ ((noinline)) foo() 
{
  ...
}

44voto

lukmac Points 831

GCC a un commutateur appelé

-fno-inline-small-functions

Ainsi l'utilisation que lors de l'évocation de gcc. Mais l'effet secondaire est que toutes les autres petites fonctions sont également non-inline.

23voto

Andy Ross Points 7024

Un portable façon de le faire est d'appeler la fonction à l'aide d'un pointeur:

void (*foo_ptr)() = foo;
foo_ptr();

Bien que ce produit différentes instructions de la direction générale, qui peut ne pas être votre objectif. Qui apporte un bon point: quel est votre objectif?

15voto

arsane Points 6500

Dans le cas où vous obtenez une erreur du compilateur pour "attribut((noinline))", vous pouvez juste essayer:

noinline int func(int arg)
{
    ....
}

12voto

KenBee Points 91
static __attribute__ ((noinline))  void foo()
{

}

C'est ce qui a fonctionné pour moi.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X