Je sais comment inverser l'ordre des octets (convert big endian to little endian in C [without using provided func]) - dans ce cas, je voudrais utiliser __builtin_bswap64copie octet inversé uint64_t à uint8_t tableau
Je sais aussi comment copier un uint 64 bits à un tableau de caractères - idéalement memcopy. (How do I convert a 64bit integer to a char array and back?)
Mon problème est la combinaison des deux. A la racine du problème, je suis en train de trouver une alternative plus rapide à ce code:
carr[33] = ((some64bitvalue >> 56) & 0xFF) ;
carr[34] = ((some64bitvalue >> 48) & 0xFF) ;
carr[35] = ((some64bitvalue >> 40) & 0xFF) ;
carr[36] = ((some64bitvalue >> 32) & 0xFF) ;
carr[37] = ((some64bitvalue >> 24) & 0xFF) ;
carr[38] = ((some64bitvalue >> 16) & 0xFF) ;
carr[39] = ((some64bitvalue >> 8) & 0xFF) ;
carr[40] = (some64bitvalue & 0XFF);
Comme memcopy ne prend pas le résultat de __builtin_bswap64 comme argument source (? Ou est-elle), j'ai essayé ce :
*(uint64_t *)upub+33 = __builtin_bswap64(some64bitvalue);
mais je me retrouve avec l'erreur : lvalue requis comme opérande gauche d'affectation
y at-il une alternative plus rapide au code original que je suis en train de remplacer du tout?
Quel est le type de 'upub'? Vous violez peut-être des règles strictes d'alias. – user694733
Pourquoi supposez-vous que c'est trop lent? Avez-vous regardé le code d'assemblage? Avez-vous profilé?Concentrez-vous sur l'écriture d'un code portable et lisible en premier lieu (par exemple en l'enveloppant dans une fonction), optimisez uniquement si vous avez un problème de vitesse. – Olaf
J'ai un problème de vitesse et je suis conscient du "problème d'optimisation prématuré". Ne s'applique pas ici. Ma supposition était basée purement sur l'intuition, mais comparée à '* ((uint64_t *) upub + 33) = __builtin_bswap64 (some64bitval);' mon intuition s'est avérée juste. – Perlator