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 pour cette question! J'ai été profilage avec oprofile lorsqu'une fonction n'a pas, les réponses ici corrigé cela.
Vous devez vous connecter pour publier un commentaire.
Vous voulez le
gcc
spécifiquesnoinline
attribut.L'utiliser comme ceci:
GCC a un commutateur appelé
-fno-inline-small-functions
Ainsi l'utilisation que lors de l'invocation de gcc. Mais l'effet secondaire est que toutes les autres petites fonctions sont également non-inline.
-fno-inline
ne fonctionnent pas du tout.gdb
toujours entre les méthodes sur l'étape-dessus. Quelque chose est cassé, et je doute qu'il estgdb
.Un portable façon de le faire est d'appeler la fonction à l'aide d'un pointeur:
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: quelle est votre but ici?
Dans le cas où vous obtenez une erreur du compilateur pour
__attribute__((noinline))
, vous pouvez juste essayer:Je sais que la question est à propos de GCC, mais j'ai pensé qu'il pourrait être utile d'
avoir quelques informations sur les compilateurs d'autres compilateurs ainsi.
De GCC
noinline
la fonction d'attribut est assez populaire avec d'autres compilateurs ainsi. Il
est pris en charge par au moins:
__has_attribute(noinline)
)certains qu'il fonctionne sur 16.0+)
__TI_GNU_ATTRIBUTE_SUPPORT__
)En outre, MSVC prend en charge
__declspec(noinline)
de retour à Visual Studio 7.1. Intel supporte probablement trop (ils essaient de
être compatible à la fois avec GCC et MSVC), mais je n'ai pas pris la peine de
vérifier que. La syntaxe de base est le même:
IGP 10.2+ (et probablement plus) prend en charge une
noinline
pragma quis'applique à la fonction suivante:
TI 6.0+ prend en charge une
FUNC_CANNOT_INLINE
pragma qui (ennuyée) fonctionne différemment en C et C++. En C++, il est semblable à de PGI:
En C, toutefois, le nom de la fonction est requise:
Cray 6.4+ (et peut-être plus tôt) adopte une approche similaire, nécessitant
le nom de la fonction:
Oracle Developer Studio prend également en charge un pragma qui prend la
nom de la fonction, le retour à l' au moins Forte Développeur
6,
mais notez qu'il doit venir après la déclaration, même dans les dernières
versions:
Selon la façon dont vous êtes dévoué, vous pouvez créer une macro qui
serait de travailler partout, mais vous auriez besoin d'avoir le nom de la fonction en tant que
ainsi que de la déclaration en tant qu'arguments.
Si, otoh, que, vous n'êtes pas d'accord avec quelque chose qui fonctionne pour la plupart des gens,
vous pouvez vous en sortir avec quelque chose qui est un peu plus esthétique
agréable et ne nécessite pas de se répéter. C'est l'approche
J'ai pris pour Hedley, où l'
version actuelle de
HEDLEY_NEVER_INLINE
ressemble:
Si vous ne voulez pas utiliser de Hedley (c'est un seul domaine public /CC0
l'en-tête), vous pouvez convertir le contrôle de version de macros sans trop de
effort, mais plus que je suis prêt à mettre dans ☺.
C'est ce qui a fonctionné pour moi.
Utiliser le
noinline
attribut:Vous devriez probablement utiliser à la fois lorsque vous déclarez la fonction pour un usage externe et lorsque vous écrivez la fonction.
Je travaille avec gcc 7.2. J'ai précisément besoin d'une fonction non-inline, car il a dû être instancié dans une bibliothèque. J'ai essayé le
__attribute__((noinline))
réponse, ainsi que laasm("")
réponse. Ni l'un a résolu le problème.Enfin, j'ai compris que la définition d'une variable statique à l'intérieur de la fonction forcer le compilateur à allouer de l'espace dans la variable statique de bloc et d'émettre une initialisation pour elle lorsque la fonction est appelée en premier.
C'est en quelque sorte un sale tour, mais il fonctionne.
inline void foo(void) { ... }
dans un en-tête et de le déclarerextern inline void foo(void);
dans une bibliothèque fichier source. Suivant la sémantique C99, le compilateur aurait permis aux commandes de la fonction quand il lui plaît ET émettent de code objet dans votre bibliothèque. Voir Est "en ligne" sans "statique" ou "extern" jamais utile en C99 ?.