Disons que j'ai cette petite fonction dans un fichier source
static void foo() {}
et je construis une version optimisée de mon binaire mais je ne veux pas que cette fonction soit intégrée (à des fins d'optimisation). y a-t-il une macro que je peux ajouter dans un code source pour empêcher l'inlining?
Réponses:
Vous voulez l' attribut
gcc
-specificnoinline
.Utilisez-le comme ceci:
la source
GCC a un commutateur appelé
-fno-inline-small-functions
Utilisez-le donc lors de l'appel de gcc. Mais l'effet secondaire est que toutes les autres petites fonctions sont également non intégrées.
la source
-fno-inline
ne fonctionne pas du tout.gdb
entre toujours des méthodes lors du passage au pas Quelque chose est cassé, et j'en doutegdb
.Un moyen portable de le faire est d'appeler la fonction via un pointeur:
Bien que cela produise des instructions différentes pour créer une branche, ce n'est peut-être pas votre objectif. Ce qui soulève un bon point: quel est votre objectif ici?
la source
Je sais que la question concerne GCC, mais j'ai pensé qu'il pourrait être utile d'avoir des informations sur les compilateurs d'autres compilateurs également.
L'
noinline
attribut function de GCC est également très populaire auprès d'autres compilateurs. Il est soutenu par au moins:__has_attribute(noinline)
)__TI_GNU_ATTRIBUTE_SUPPORT__
)En outre, MSVC prend
__declspec(noinline)
en charge le retour à Visual Studio 7.1. Intel le supporte probablement aussi (ils essaient d'être compatibles avec GCC et MSVC), mais je n'ai pas pris la peine de le vérifier. La syntaxe est fondamentalement la même:PGI 10.2+ (et probablement plus ancien) prend en charge un
noinline
pragma qui s'applique à la fonction suivante:TI 6.0+ prend en charge un
FUNC_CANNOT_INLINE
pragma qui (ennuyeusement) fonctionne différemment en C et C ++. En C ++, c'est similaire à PGI:En C, cependant, le nom de la fonction est obligatoire:
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 le nom de la fonction, remontant au moins à Forte Developer 6 , mais notez qu'il doit venir après la déclaration, même dans les versions récentes:
En fonction de votre dévouement, vous pouvez créer une macro qui fonctionnerait partout, mais vous auriez besoin d'avoir le nom de la fonction ainsi que la déclaration comme arguments.
Si, OTOH, vous êtes d'accord avec quelque chose qui fonctionne juste pour la plupart des gens, vous pouvez vous en tirer avec quelque chose qui est un peu plus esthétique et ne nécessite pas de vous répéter. C'est l'approche que j'ai adoptée pour Hedley , où la version actuelle de HEDLEY_NEVER_INLINE ressemble à:
Si vous ne voulez pas utiliser Hedley (c'est un seul en-tête de domaine public / CC0), vous pouvez convertir les macros de vérification de version sans trop d'effort, mais plus que je ne suis prêt à en mettre ☺.
la source
Si vous obtenez une erreur de compilation pour
__attribute__((noinline))
, vous pouvez simplement essayer:la source
C'est ce qui a fonctionné pour moi.
la source
Utilisez l'
noinline
attribut :Vous devriez probablement l'utiliser à la fois lorsque vous déclarez la fonction pour un usage externe et lorsque vous écrivez la fonction.
la source
Je travaille avec gcc 7.2. J'avais spécifiquement besoin qu'une fonction ne soit pas intégrée, car elle devait être instanciée dans une bibliothèque. J'ai essayé la
__attribute__((noinline))
réponse, ainsi que laasm("")
réponse. Aucun des deux n'a résolu le problème.Enfin, j'ai pensé que définir une variable statique à l'intérieur de la fonction forcerait le compilateur à lui allouer de l'espace dans le bloc de variable statique et à émettre une initialisation pour celle-ci lorsque la fonction est appelée pour la première fois.
C'est une sorte de sale tour, mais ça marche.
la source
inline void foo(void) { ... }
dans un en-tête et la déclarerextern inline void foo(void);
dans un fichier source de bibliothèque. Suivant la sémantique C99, le compilateur serait autorisé à incorporer la fonction quand bon lui semble ET à émettre du code objet dans votre bibliothèque. Voir "inline" sans "static" ou "extern" est-il jamais utile dans C99? .