Est-il un moyen de demander à GCC de ne pas optimiser un morceau de code?
Je suis en train de travailler sur un projet qui s'appuie sur les optimisations du compilateur, mais j'ai besoin du code de ne pas être optimisé par la GCC. Est-ce possible?
double possible de Comment prévenir la gcc optimisation de certaines déclarations en C?
OriginalL'auteur limp | 2011-04-07
Vous devez vous connecter pour publier un commentaire.
GCC a depuis 4.4. le
#pragma GCC optimize ("whatever")
. Je vous recommande aussi à encapsuler le code particulier, qui est annoté avec cette pragma avec#pragma GCC push_options
et#pragma GCC pop_options
. La première permettra d'économiser les options telles qu'elles étaient avant votre changement, le plus tard sera de les restaurer par la suite et le reste du code ne compile avec le mondiale options.Pour plus de détails sur la quelle que soit chaîne, vous devriez regarder dans la doc de gcc, ici la partie la plus importante de celui-ci:
Arguments can either be numbers or strings. Numbers are assumed to be an optimization level. Strings that begin with O are assumed to be an optimization option, while other options are assumed to be used with a -f prefix.
.Cela signifie que si vous ne voulez pas l'optimisation de votre code votre quelle que soit devrait simplement être "0".
oh non, ça ne fonctionne pas. Cette pragma ne fait pratiquement rien que d'ajouter la corrosponding attribut drapeau de la fonction(s). Donc, si vous voulez vraiment changer les options sur une petite partie d'une fonction que vous avez au moins pour le déplacer vers un subfuction. Ce n'est pas possible de faire à l'intérieur des fonctions, comme de nombreuses optimisations de travail sur l'ensemble des fonctions et techniquement, il n'est pas possible de modifier le comportement de quelques-unes de ses parties.
Ok, donc AFAIU qui signifie que les #pragma GCC optimiser a une portée de fichier. Si j'ai mis dans le début du fichier source #pragma GCC push_options #pragma GCC optimiser ("O0") et puis le #pragma GCC pop_options à la fin du fichier, je suppose que tout le code/les fonctions contenues dans ce fichier, ne sera pas optimisé, ai-je le droit?
Oui, le début et la fin sera de traiter l'ensemble du fichier. Mais vous pouvez faire plus de particules fines. La granularité est la fonction c'est à dire que vous pouvez optimiser les fonctions dans un fichier différent (vous devez déclarer entre les fonctions) - vous juste ne peux pas le faire à l'intérieur de la fonction pour traiter une seule fonction différente.
Il vaut la peine de noter que Clang travaille également avec
#pragma GCC
pour des raisons de compatibilité.OriginalL'auteur flolo
GCC 4.4 a un attribut pour que:
Il est documenté à: https://gcc.gnu.org/onlinedocs/gcc-5.1.0/gcc/Function-Attributes.html#index-g_t_0040code_007boptimize_007d-function-attribute-3195
Seulement dans le corps de la fonction (comment faire autrement, parce qu'il pourrait appeler des fonctions qui sont appelées à partir de lieux que ont les optimisations activées...)
Avez-vous vraiment besoin d'un trait d'union avant O3?
OriginalL'auteur sehe
Vous pouvez mettre ce morceau de code dans un autre fichier et de le compiler sans optimisations.
Ou essayez d'utiliser la directive #pragma:
Ou encore mieux de démarrer et d'arrêter l'optimisation avec :
vient de mettre précompilateur directives dans votre code
Sont tous des éléments suivants pris en charge par GCC?: #pragma GCC optimiser 1 #pragma GCC optimiser 0 #pragma OPTIMISER OFF #pragma OPTIMISER SUR le #pragma optimiser ( "") #pragma optimiser ( "" ) Aussi, puis-je utiliser ces pragmas à l'intérieur des fonctions?
dépend de votre version de gcc. @fiolo a souligné que est de 4,4 .
Également sur la plate-forme, il me semble. Sur Raspbian (armv7l) ce ne sont pas pris en charge en dépit de GCC est la version 4.9.2 :(.
__attribute__
semble fonctionner.OriginalL'auteur Heisenbug