2010-08-19 3 views
2

J'ai enquête ont l'effet de __restricting certains pointeurs dans un C++ - code, lors de la compilation via le GCC-compilateur.Est-ce que le compilateur GCC C++ prend en compte les instructions __restrict?

Il se que non seulement l'exécution reste tout à fait le même, mais l'exécutable ne semble pas avoir changé, la taille en octets est exactement le même que précédemment.

Mon GCC version est

gcc version 4.3.2 [gcc-4_3-branch revision 141291] (SUSE Linux) 

et bien qu'il accepte cette C++ - l'extension lors de l'analyse, il ne semble pas considérer lors du montage du code. Il y a donc une raison, le compilateur ne sait pas comment utiliser cette information sémantique, ou le traitement de cette information est complètement désactivé.

Le code effectue beaucoup de crissement numéro, il aimerait avoir permis à des fins de test. Pouvez-vous aider?

+0

Sans le code, il est vraiment difficile de dire quoi que ce soit. Il est possible que, avec la façon dont le code est écrit, le mot clé '__restrict' ne vous achète rien. Il y a des cas (deux pointeurs pointant vers des types différents sont supposés ne pointer jamais vers la même mémoire à moins que l'un d'entre eux soit 'char *') dans lequel il est simplement supposé quand même. – Omnifarious

+0

Le mot-clé 'restrict' a un effet très spécifique sur l'assembly généré. Vous devriez utiliser 'objdump' ou' gcc -S' pour regarder l'assemblage qu'il génère pour voir quel est l'effet. La taille de votre exécutable et votre temps d'exécution sont de piètres repères de son effet. – greyfade

+0

La question n'est pas encore de savoir si la connaissance de plusieurs tableaux étant disjoints ne sert à rien pour le compilateur, car les exécutables construits sont complètement les mêmes octets pour les octets. Par conséquent, je suppose que la fonctionnalité est désactivée dans le compilateur lui-même. – shuhalo

Répondre

7

restrict qualificatifs sont essentiellement un moyen pour l'utilisateur d'aider le compilateur à effectuer certaines optimisations liées à l'aliasing. Ils n'auront d'effet que si ces opportunités d'optimisation sont déjà présentes dans le code, donc l'utilisation de restrict leur permet simplement dans des situations où le compilateur devait auparavant utiliser une génération de code "plus sûre" (non-optimisante). Dans d'autres contextes restrict n'aura aucun effet du tout.

Donc, vous avez ajouté quelques qualificatifs restrict à votre code. Mais est-ce que l'un d'entre eux a été utilisé dans le contexte où ils ont réellement de l'importance, c'est-à-dire où ils donnent réellement plus de liberté au compilateur pour optimiser le code? Sinon, vous n'êtes pas censé attendre que votre code change.

+0

Je l'ai employé pour plusieurs fonctions qui assemblent une matrice et résolvent un système linéaire. Ceux-ci traitent plusieurs tableaux qui représentent des quantités et des paramètres nodaux et les traitent dans une boucle énorme. Par conséquent, je suppose que cette information pourrait être utile de savoir pour l'optimiseur. – shuhalo

Questions connexes