C memcpy dans le sens inverse
Je suis en train de travailler avec des données audio. J'aimerais jouer le fichier de l'échantillon dans le sens inverse. Les données sont stockées comme des entiers non signés et des paniers de nice et serré. Est-il un moyen d'appeler memcpy
qui va copier dans l'ordre inverse. c'est à dire si j'avais 1,2,3,4 stockées dans un tableau, j'ai pu appeler memcpy
et comme par magie inverse, donc en fait je obtenir 4,3,2,1.
C n'a pas une fonction comme ça, mais il est très facile d'en écrire un.
Il pourrait être intéressant d'étudier la possibilité de modifier la façon dont vous iterate sur les données plutôt que de changer l'ordre, je pense qu'il serait plus efficace...
Vous avez je me suis perplexe avec magie.
Mark, je n'ai pas réitérer, je copie tampons en morceaux. Craig - ordinateurs sont à la magie? 🙂
Les ordinateurs, cool, qui est une approximation de magie pour certaines raisons je suppose. 🙂
Il pourrait être intéressant d'étudier la possibilité de modifier la façon dont vous iterate sur les données plutôt que de changer l'ordre, je pense qu'il serait plus efficace...
Vous avez je me suis perplexe avec magie.
Mark, je n'ai pas réitérer, je copie tampons en morceaux. Craig - ordinateurs sont à la magie? 🙂
Les ordinateurs, cool, qui est une approximation de magie pour certaines raisons je suppose. 🙂
OriginalL'auteur Aran Mulholland | 2010-02-11
Vous devez vous connecter pour publier un commentaire.
Cela fonctionne pour la copie
int
s dans le sens inverse:Comme
memcpy()
, les régions souligné pardst
etsrc
ne doivent pas se superposer.Si vous voulez inverser en place:
À la fois les fonctions ci-dessus sont portables. Vous pourriez être en mesure de les rendre plus rapidement à l'aide de matériel spécifique code.
(Je n'ai pas testé le code est correct.)
memcpy
devrait être O(n) et donc si cereverse_memcpy
fonction.Avec mon test rapide, avec
-O3
optimisation,reverse_memcpy()
est environ 3 fois plus lent quememcpy()
pour la copie 1000000 octets. Pour 10000 itérations avec 1000000 octets,memcpy()
a pris 4 secondes, etreverse_memcpy()
a eu 11. Mais ces chiffres sont à un cas très spécifique, de sorte que vous pouvez tester des choses pour vous-même. Bien sûr, comme dreamlax dit, les deux sont en O(n).seulement si
dst==src
.J'ai réalisé que les OP pourraient vouloir s'inverser en place. J'ai été l'édition de mon post quand vous avez fait le commentaire. D'accord avec votre point complètement. La "première édition" de ma réponse avait un avertissement sur la nécessité pour les non-chevauchement des régions et de l'utilisation de
restrict
mot-clé dans C99...OriginalL'auteur Alok Singhal
Non, memcpy ne le ferai pas en arrière. Si vous travaillez en C, écrire une fonction pour le faire. Si vous êtes vraiment à travailler en C++ utilise std::reverse ou std::reverse_copy.
OriginalL'auteur janm