Dispositif moche
Dans le de l'informatique, le dispositif moche est un l'exécution optimisée de d'une copie périodique qui emploie une technique largement appliquée dans le langage d'assemblage pour la boucle de déroulant . Sa découverte est créditée au Tom moche en novembre du 1983 , qui alors fonctionnait pour le Lucasfilm . C'est peut-être l'utilisation la plus dramatique de l'étiquette de cas tomber-à travers dans le langage de programmation du C jusqu'ici. Noter que moche ne demande pas le crédit pour découvrir le concept du déroulement de boucle, juste cette expression particulière de lui dans le C.
Version originale
Traditionnellement, une copie périodique regarderait le goût : lang=" de
Noter que Tout en optimisant ceci, moche rendu compte qu'une version déroulée de sa boucle pourrait être mise en application par l'entrelacement de les structures d'un commutateur et d'une boucle. lang=" de Basé sur un algorithme appliqué largement par des programmeurs codant dans le pour réduire au minimum le nombre d'essais et de branches pendant une copie, le dispositif moche apparaît hors de l'endroit une fois mis en application dans le C. Le dispositif est C valide et légal en vertu des spécifications relaxed du rapport du commutateur de dans la définition de langue. À l'heure de l'invention du dispositif c'était la première édition du le langage de programmation de C qui exige seulement que l'ordre de contrôle du commutateur de soit un rapport (composé) syntactiquement valide dans lequel des étiquettes du cas de peut sembler mettant en tête n'importe quel secondaire-rapport. En même temps que le fait que, en l'absence d'un rapport de la coupure de , l'ordre d'exécution le tomber-à travers d'un rapport a commandé par une étiquette du cas de à cela commandé par le prochain, ceci signifie que le code spécifie une succession des copies du compte s adresses de source séquentielles au port de rendement mémoire-tracé. Noter que, comme documenté dans le commentaire, le code suppose que le compte de est strictement positif. Son comportement est non défini s'il est écrit avec le compte de ayant la valeur zéro. Beaucoup de compilateurs optimiseront le commutateur dans une table de saut juste comme serait fait dans une exécution d'assembleur. Le défaut du c tomber-à travers au cas où les rapports serait longtemps son dispositif simple plus controversé ; Moche observé ce " ; Ce code forme une certaine sorte d'argument au cours de cette discussion, mais je ne suis pas sûr pour si elle est ou against." ; Pourquoi est-il ce plus rapide qu'une boucle simple et directe ? L'augmentation primaire de la vitesse vient du déroulement de boucle , qui réduit le nombre de comparaisons effectuées pendant une boucle. Le rapport de commutateur/cas est employé pour manipuler le reste des données pas également divisibles par le nombre d'opérations déroulées (dans cet exemple, 8 mouvements de byte sont déroulés, ainsi le commutateur/cas manipule un 1&ndash supplémentaire ; 7 bytes automatiquement). Cette manipulation automatique du reste peut ne pas être la meilleure solution sur tous les systèmes et &mdash de compilateurs ; dans certains cas deux boucles peuvent réellement être plus rapides (une boucle, déroulée, pour faire la copie principale, et une deuxième boucle pour manipuler le reste). Le problème semble descendre à la capacité du compilateur d'optimiser correctement le dispositif, bien qu'au moins une personne ait proposé qu'il puisse également interférer la prévision de canalisation et de branche sur quelques architectures. Par conséquent, en considérant en utilisant ce code, il peut valoir de courir quelques repères pour vérifier que c'est réellement le code le plus rapide sur l'architecture cible, au niveau d'optimisation de cible, avec le compilateur de cible. *to++ = *from++ ; Cette forme modifiée du dispositif apparaît comme " ; que ce code fait-il ? " ; exercer dans le de livre de s de Stroustrup Bjarne le 'le langage de programmation de C++ , vraisemblablement parce que des programmeurs de novice ne peuvent pas être prévus savoir le rendement mémoire-tracé s'enregistre. Cependant, il n'est pas particulièrement utile sous cette forme puisque la bibliothèque de C standard fournit déjà une fonction de mémoire-copie qui est susceptible d'être bien plus optimisée. .
to est le pas incrémenté parce que moche copiait à un registre du rendement mémoire-tracé par simple . Dans C moderne ceci serait communiqué en employant le mot-clé volatil du de en tant que qualificateur dans la déclaration de l'indicateur to. La version de Stroustrup
Le dispositif original a été fait pour copier à un registre. Pour copier réellement la mémoire d'un endroit à l'autre, vous devez ajouter un auto-incrément à chaque référence au à , comme ainsi : Livres
Bjarne Stroustrup : le langage de programmation de C++, troisième édition , Addison-Wesley, ISBN 0-201-88954-4
Brian Kernighan et Dennis Ritchie : le langage de programmation de C Random links: Bootsie et Snudge | Vila Velha | Château de système mv Bloemfontein | Règle de Durham | Épée de Nader Shah | Dispositivo_sin_valor