2010-09-27 4 views
5

Y a-t-il une raison pour laquelle le compilateur ne peut pas optimiser les 2 instructions suivantes dans la main même j'ai allumé l'optimisation complète dans Visual C++? Un effet secondaire pour accéder à une variable int en mémoire?Pourquoi le compilateur ne peut-il pas optimiser ces 2 instructions?

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    volatile int pleaseOptimizeMeOut = 100; 

    (pleaseOptimizeMeOut); 

    return 0; 
} 

Répondre

16

Il ne peut pas les optimiser parce que vous avez déclaré la variable à volatile. Charge et stocke à volatile les objets qualifiés font partie des effets "visibles de l'extérieur" de la machine abstraite C.

(Soit dit en passant, il y a beaucoup d'effets secondaires lors de l'accès d'une variable en mémoire, il peut mettre à jour les caches de mémoire de matériel, y compris le TLB, et peut-être aussi causer des défauts de page et la mémoire de votre processus est exécuté dans la puissance. être snoopé par un autre processus, comme un débogueur).

+5

Cet effet est en quelque sorte le "point" de "volatile". – SingleNegationElimination

5

Sur certains ordinateurs, les E/S de périphérique sont modélisées en tant que lecture/écriture de la mémoire. C'est le genre de situation où le volatile est correctement utilisé ... il dit explicitement au compilateur de ne pas supposer que les opérations variables ne sont pas importantes ou peuvent être optimisées ....

8

volatile indique explicitement au compilateur de ne pas optimiser pour cette variable.

4

D'autres réponses ont souligné l'importance de volatile ici, et je n'ai rien à ajouter à cela. Cependant, je tiens à dire à quel point il est important qu'une telle construction existe, parce que est utile. De mon expérience de conception de matériel, plusieurs fois l'interface entre un CPU et un bloc logique dans HW est basée sur les écritures et les lectures de la mémoire. Cela signifie que lorsqu'une CPU lit un registre du HW, quelque chose se produit (c'est-à-dire, efface les effacements, avance la file d'attente, et beaucoup d'autres options).

Maintenant, une fois que vous exécutez l'accès à pleaseOptimizeMeOut, car il est volatile le compilateur suppose que vous pourriez avoir fait juste pour l'effet secondaire, il serait tout à fait tort de l'optimiser. Supposons que la variable soit mappée à une file d'attente matérielle et que vous vouliez juste avancer la file d'attente sans en prendre une valeur. Cela dit, mapper des variables aux registres lors de la lecture a des effets secondaires est une mauvaise pratique à mon humble avis, et il serait préférable de l'encapsuler avec un appel de fonction, exactement pour la raison que votre question démontre - c'est déroutant dans certains cas.

Mapper des variables sur des registres sans effets secondaires est très utile et largement utilisé, cependant.

Questions connexes