95 votes

Comment empêcher gcc d'optimiser certaines déclarations en C?

Afin de prendre une page de sales (commutation sur le bit d'impureté dans la page d'entrée de la table), je touche les premiers octets de la page comme ceci:

pageptr[0] = pageptr[0];

Mais, dans la pratique, gcc va ignorer la déclaration de morts magasin élimination. Afin de prévenir l'optimisation de gcc, je ré-écrire l'instruction comme suit:

volatile int tmp;
tmp = pageptr[0];
pageptr[0] = tmp;

Il semble que l'astuce fonctionne, mais un peu laid. Je voudrais savoir est-il des directives ou de syntaxe qui a le même effet? Et je ne veux pas utiliser un -O0 drapeau, car il apportera de grandes performances.

171voto

Plow Points 1200

Vous pouvez utiliser

 #pragma GCC push_options
#pragma GCC optimize ("O0")

your code

#pragma GCC pop_options
 

désactiver les optimisations depuis GCC 4.4.

Consultez la documentation de GCC si vous avez besoin de plus de détails.

120voto

FRob Points 625

Au lieu d'utiliser les nouveaux pragmas, vous pouvez également utiliser __attribute__((optimize("O0"))) pour vos besoins. Cela présente l'avantage de ne s'appliquer qu'à une seule fonction et non à toutes les fonctions définies dans le même fichier.

Exemple d'utilisation:

 void __attribute__((optimize("O0"))) foo(unsigned char data) {
    // unmodifiable compiler code
}
 

82voto

Dietrich Epp Points 72865

Utilisez le qualificatif de type volatile . Exemple:

 ((unsigned char volatile *)pageptr)[0] = pageptr[0];
 

Le qualificatif de type volatile demande au compilateur d'être strict en ce qui concerne les magasins de mémoire et les charges. Cela ne désactive pas l'optimisation en soi, mais il fait ce que vous voulez.

Edit: J'avais mis volatile sur le mauvais côté de la *. Oups, corrigé.

-1voto

Phong Points 3572

Avec le gcc options -O0 , il devrait fonctionner. (ce qui signifie no optimisation)

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