12
votes

Hauteur de cordes de compilation

Je dois utiliser une chaîne comme ID pour obtenir un objet. Pour mettre en œuvre cela dans un temps d'exécution et fonctionne bien. Mais cela rend le type statique à la vérification impossible, pour des raisons évidentes.

J'ai googlé pour l'algorithme de calcul de la somme Hash-Somme de la chaîne dans la compilation: CLASH STRONT DE TIME CI ++ avec BOOST.MPL .

Il semble que cela semble Soyez la solution parfaite à mon problème, sauf que la sring nécessaire à l'algorithme doit être divisée en morceaux de 4 caractères, ou de caractère par caractère, pour des raisons évidentes.

IE, Au lieu de l'enregistrement actuel habituel de l'ID's, je devrai écrire de cette façon: xxx

ceci est absolument inutilisable.

La question est, Comment passer correctement la chaîne telle que "objet.method" sur cet algorithme?

merci à tous.


4 commentaires

Pouvez-vous utiliser la structure avec une chaîne statique au lieu de chaîne directement? Peut-être une macro pour les générer aussi?


@AAA: Les macros ne divisent pas les jetons, ils peuvent les régler ou les concaténer, mais pas les diviser.


@Matt Macros pour générer des struct avec nom et chaîne statique. par exemple #define str (n) struct n {...}


Toute pensée d'utilisation de GPERF et d'envelopper les résultats avec un type?


4 Réponses :


5
votes

Je ne sais pas d'une façon de le faire avec le pré-processeur ou avec des modèles. Je soupçonne que votre meilleur pari est de créer une étape de pré-compilation séparée (par exemple avec Perl ou telle) pour générer les instructions HASH_CSTRING d'un ensemble d'instructions Source. Ensuite, au moins vous n'avez pas besoin de fractionner les cordes manuellement lorsque vous en ajoutez de nouveaux, et la génération est entièrement automatisée et répétable.


0 commentaires

1
votes

Les modèles peuvent être instanciés avec n'importe quel symbole externe, cela devrait donc fonctionner comme prévu: xxx

(étant donné le modèle hash_cstring <> est capable de traiter avec le pointeur valeurs).


0 commentaires

9
votes

solution avec GCC-4.6: xxx

http://liveworkspace.org / Code / dpobf

I`M Happy!


4 commentaires

Vous obtenez-vous réellement cela pour compiler avec GCC 4.6 sans erreur de récursivité?


Drôle, mon GCC-4.6.1 (Mingw-TDM) rejette ce code avec ladite erreur (est la raison pour laquelle j'ai demandé).


Dans l'instanciation de 'statique consexprzeprze_t_t hash_calc :: Appliquer (Const de caractère (&) [N]) [avec non signé INT N = 10U, Taille_t = non signé int]': récursivement instancié de 'statique consexprzeprze_t_t hash_calc < N, I> :: Appliquer (Cons-Char (&) [N]) [avec non signé INT N = 10U, non signé INT I = 1U, Taille_t = non signé Int] 'Instancié de' statique consexprzeprze_t hash_calc : : Appliquer (Cons-Char (&) [N]) [avec non signé INT N = 10U, non signé INT I = 0U, Taille_t = non signé Int] 'Instancié de' consexpr Size_t hachage (Cons-Char (&) [N]) [avec non signé int n = 10u, taille_t = non signé int] '


Je ne suis pas sûr de la construction de TDM. J'utilise ces bâtiments: code.google.com/p/mingw-builds



1
votes

Si quiconque est intéressé, je traverse comment créer un hachage de temps de compilation de Murmur3_32 à l'aide de fonctions ConstExpr et de modèles variadiques ConstExPR ici:

http: //roarttinon.blogspot. SG / 2014/10 / compile-time-murmur-hash-in-c.html

La plupart des exemples que j'ai vus faire face aux hachages qui sont basés sur la consommation d'un caractère de la chaîne à la fois. Le hachage murmur3_32 est un peu plus intéressant en ce sens qu'il consomme 4 caractères à la fois et nécessite un code de cas spécial pour gérer les 0, 1, 2 ou 3 octets restants.


0 commentaires