Afin de rendre une page sale (en activant le bit sale dans l'entrée du tableau des pages), je touche les premiers octets de la page comme ceci:
pageptr[0] = pageptr[0];
Mais en pratique, gcc ignorera l'instruction par élimination du magasin mort. Afin d'empêcher gcc de l'optimiser, je réécris l'instruction comme suit:
volatile int tmp;
tmp = pageptr[0];
pageptr[0] = tmp;
Il semble que le truc fonctionne, mais un peu moche. Je voudrais savoir s'il existe des directives ou une syntaxe qui ont le même effet? Et je ne veux pas utiliser de -O0
drapeau, car cela entraînera également une grande pénalité de performance.
-O0
n'empêchait pas "l'optimisation" du code mort, par exemple, lorsque GCC détecte un code n'a aucun effet, il le supprime simplement. AFAIK c'est une étape avant même-O0
... Mais c'est juste mon expérienceRéponses:
La désactivation de l'optimisation résout le problème, mais ce n'est pas nécessaire. Une alternative plus sûre consiste à empêcher le compilateur d'optimiser le magasin en utilisant le
volatile
qualificateur de type.Le
volatile
qualificateur de type indique au compilateur d'être strict sur les magasins et les charges de mémoire. L'un des objectifs devolatile
est de faire savoir au compilateur que l'accès à la mémoire a des effets secondaires et doit donc être préservé. Dans ce cas, le magasin a pour effet secondaire de provoquer une erreur de page et vous souhaitez que le compilateur conserve l'erreur de page.De cette façon, le code environnant peut toujours être optimisé, et votre code est portable vers d'autres compilateurs qui ne comprennent pas les GCC
#pragma
ou la__attribute__
syntaxe.la source
volatile
signifie que l'accès à la mémoire doit se produire tel qu'écrit, ce qui est exactement ce que nous voulons. En d'autres termes, nous y avons soigneusement réfléchi, et cela signifie ce que nous pensons que cela signifie.Vous pouvez utiliser
pour désactiver les optimisations depuis GCC 4.4.
Consultez la documentation GCC si vous avez besoin de plus de détails.
la source
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:
la source
-Olevel
option mais que j'ai utilisé les options individuelles qu'elle active séparément? (Dans mon cas, je ne peux pas déterminer quelle est l'option d'optimisation individuelle qui brise le code) .