Je travaille avec des données audio. Je voudrais lire le fichier d'exemple à l'envers. Les données sont stockées en tant qu'ints non signés et emballés bien et serrés. Y at-il un moyen d'appeler memcpy
qui copiera dans l'ordre inverse. c'est-à-dire que si j'avais 1,2,3,4 stocké dans un tableau, pourrais-je appeler memcpy
et comme par magie les inverser donc j'obtiens 4,3,2,1.C memcpy à l'envers
Répondre
Cela fonctionne pour la copie int
s en sens inverse:
void reverse_intcpy(int *restrict dst, const int *restrict src, size_t n)
{
size_t i;
for (i=0; i < n; ++i)
dst[n-1-i] = src[i];
}
Tout comme memcpy()
, les régions pointé par dst
et src
ne doivent pas se chevaucher.
Si vous souhaitez inverser en place:
void reverse_ints(int *data, size_t n)
{
size_t i;
for (i=0; i < n/2; ++i) {
int tmp = data[i];
data[i] = data[n - 1 - i];
data[n - 1 - i] = tmp;
}
}
Les deux fonctions ci-dessus sont portables. Vous pourriez être en mesure de les rendre plus rapides en utilisant du code spécifique au matériel.
(je ne l'ai pas testé le code correct.)
quelle est l'efficacité de ceci en comparaison avec memcpy? –
'memcpy' devrait être O (n) et cette fonction' reverse_memcpy' devrait l'être aussi. – dreamlax
Avec mes tests rapides, avec l'optimisation '-O3',' reverse_memcpy() 'est environ 3 fois plus lent que' memcpy() 'pour copier 1000000 octets. Pour 10000 itérations avec 1000000 octets, 'memcpy()' a pris 4 secondes, et 'reverse_memcpy()' a pris 11. Mais ces chiffres sont pour un cas très spécifique, donc vous voudrez peut-être tester les choses par vous-même. Bien sûr, comme le dit dreamlax, les deux sont O (n). –
Non, memcpy ne le fera pas à l'envers. Si vous travaillez en C, écrivez une fonction pour le faire. Si vous travaillez vraiment en C++, utilisez std :: reverse ou std :: reverse_copy.
Je sais que c'est vieux, mais pourriez-vous poster un exemple d'une fonction qui fait cela? C'est simple, mais ça pourrait aider quelqu'un. –
C ne possède pas de fonction comme ça, mais il est très facile d'écrire un. –
Il pourrait être utile d'envisager de changer la façon dont vous * itérez * sur les données plutôt que de changer l'ordre, je suppose que ce serait plus efficace ... –
Vous m'avez trouvé perplexe avec * magiquement *. –