Comment dérouler une courte boucle en C++
Je me demande comment faire pour obtenir quelque chose comme ceci:
- Écrire
copy(a, b, 2, 3)
- Et puis obtenir
a[2] = b[2]; a[3] = b[3]; a[4] = b[4];
Je sais que C #définit peut pas être utilisé de manière récursive pour obtenir cet effet. Mais je suis en C++, donc je suppose que le modèle de méta-programmation pourrait être approprié.
Je sais qu'il est un Stimuler de la bibliothèque, mais je veux seulement que "simple" truc, et le Boost est trop "bordélique".
Sont votre avant et après les mesures de performance suffisamment différentes pour que c'est le lieu de concentrer vos efforts?
cochez cette stackoverflow.com/questions/2380143/...
ouais, parce que nous ne voulons pas que les gens de simplement aller autour de techniques d'apprentissage pour l'amour de "l'éducation" ou de "curiosité" 😉
en fait, vous pouvez accomplir cela en utilisant boost de préprocesseur. J'ai fait quelque chose de similaire pour mettre en œuvre python décompresser de la sémantique dans le C++, c'est à dire
La motivation est à la fois de l'éducation et de la curiosité, donc je voudrais obtenir le code source pour que, en n'utilisant pas le coup de pouce lib.
cochez cette stackoverflow.com/questions/2380143/...
ouais, parce que nous ne voulons pas que les gens de simplement aller autour de techniques d'apprentissage pour l'amour de "l'éducation" ou de "curiosité" 😉
en fait, vous pouvez accomplir cela en utilisant boost de préprocesseur. J'ai fait quelque chose de similaire pour mettre en œuvre python décompresser de la sémantique dans le C++, c'est à dire
unpack((const int a,b,c), abcd);
La motivation est à la fois de l'éducation et de la curiosité, donc je voudrais obtenir le code source pour que, en n'utilisant pas le coup de pouce lib.
OriginalL'auteur cibercitizen1 | 2010-03-04
Vous devez vous connecter pour publier un commentaire.
La solution la plus simple pour cela est d'écrire une boucle où les valeurs début et fin sont connus:
Je pense que c'est mieux que de n'importe quel modèle ou d'exécution-l'appel de mélange: La boucle comme l'écrit est tout à fait clair pour les compilateurs' optimiseur, et il n'y a pas de niveaux de la fonction appels à creuser par le biais de juste pour voir ce qu'il se passe.
Oui je suis d'accord ! Et c'est facile à écrire un define pour être utilisé comme copie(a,b,2,4)
C'est la réponse?
"how to unroll a loop with templates"
et la réponse est de ne même pas essayer? Peut-être vous êtes le compilateur va se dérouler ce mais pas tous.un compilateur qui ne peuvent pas se dérouler ce ne peut également inline appels de fonction qui sont le résultat de divers modèle des solutions présentées. J' essayer, et c'est ce que je suis venu, qui, je crois, les rendements de déroulement de la boucle.
C'est cool. J'espérais une solution générale à un meilleur contrôle de dérouler dans le cas général. Je pensais que vous étiez d'être désagréable pour certaines raisons 😉 mais c'est très bien pour une boucle fixe.
OriginalL'auteur
C++ meta-programmation récursive.
Pensez à votre problème dans les termes de la récursivité. Mettre en œuvre terminal cas et non-cas terminaux.
Votre terminal cas peut être 0 ou un. Passer les limites des paramètres de modèle. Utiliser une structure/classe parce qu'ils permettent la formulation de spécialisation et d'autres choses intéressantes:
source
etdestination
besoin d'être déclarée; ce n'est pas compilé tel qu'il est.Hey, c'est le même code que j'ai donné dans ma question: stackoverflow.com/questions/2380143/... est ce que cela signifie, c'est la seule façon de le faire à l'aide de modèles.
Ummm...
source
etdestination
sont les arguments?N'est-ce pas de copie de la "destination" à la "source"? Aussi, pouvez-vous montrer un compilable exemple de la construction en cours d'utilisation? J'ai essayé d'utiliser
copy<2, 3>(a, b);
et G++ 6.2.0 n'était pas heureux, même après que j'ai utiliserstatic void apply(int source[], int destination[])
dans les définitions de fonction. Il donne une erreurno matching function for call to 'copy<2, 3>::copy(int [6], int [6])'
. Il énumère les 3 candidats :: constexpr copy<2, 3>::copy()
,constexpr copy<2, 3>::copy(const copy<2, 3>&)
, etconstexpr copy<2, 3>::copy(copy<2, 3>&&)
et rejette tous car ils s'attendent à 0 ou 1 et arguments sont donnés 2.OriginalL'auteur Anycorn
Vous pouvez probablement faire quelque chose comme ce qui suit. En fonction de votre compilateur et le optimziation les paramètres que vous utilisez, vous peut obtenir l'effet que vous recherchez.
Être conscient que pour les petits objets comme char, il pourrait bien être plus lent qu'un
std::copy
ou unmemcpy
et que, pour les objets plus grands, le coût d'une boucle est susceptible d'être insignifiant par rapport aux copies sur en tout cas.J'ai écrit ce de façon indépendante, mais à un schéma connu.
OriginalL'auteur CB Bailey
Il est important de réaliser que le compilateur est très intelligent, et que les incitant à dérouler les boucles à l'aide du modèle de la métaprogrammation va probablement vous qu'il vous arrive de l'avant.
Pour obtenir le fond de votre optimisations: gardez un oeil sur le démontage. Ce sera j'espère vous apprendre de plus que de jeter des modèles au problème.
Et la note, comme Johannes dit: si le compilateur peut voir que vous exécutez une boucle pour un nombre fixe de fois (ou un multiple fixe de fois 4x variable), il peut créer un code très proche de l'optimal.
OriginalL'auteur Jan
Il n'utilise pas de modèles et il n'est pas "complet" déroulage, mais vous pouvez partiellement dérouler la boucle avec quelque chose comme ceci:
Maintenant, dans cet exemple particulier, les calculs impliqués probablement l'emportent sur les avantages à partir de seulement dérouler les quatre éléments à la fois. Vous devriez obtenir une augmentation de bénéficier d'un nombre croissant d'éléments à l'intérieur de la boucle du haut (sur l'ensemble de la fonction, remplacer
4
avec toutefois de nombreux éléments que vous copiez à l'intérieur de chaque manuellement déroulé itération).OriginalL'auteur bta
Na, tout cela signifie que les gens sont trop paresseux pour faire quelque chose, mais d'une recherche et d'en faire une question de la réponse....
OriginalL'auteur Corwin
Boucle unrolloing à l'aide de méta-programmation peut être utilisé pour créer constexpr (je n'ai pas mesuré le temps). J'ai un exemple où il peut être utilisé pour faire de la fonction de combinaison(n, k) un cosntexpr:
OriginalL'auteur Marco
De http://www.sgi.com/tech/stl/Vector.html:
OriginalL'auteur Anthony Labarre
OriginalL'auteur user7414920