Hello,
Quelle est la meilleure méthode pour copier des blocs de mémoire ?
Utiliser memcpy du C, ou il y a mieux ?
MercI;
Hello,
Quelle est la meilleure méthode pour copier des blocs de mémoire ?
Utiliser memcpy du C, ou il y a mieux ?
MercI;
Passer à un niveau supérieur en utilisant des outils qui gère la mémoire à notre place et qui sont copiables sans se poser de questions.
"Never use brute force in fighting an exponential." (Andrei Alexandrescu)
Mes articles dont Conseils divers sur le C++
Une très bonne doc sur le C++ (en) Why linux is better (fr)
Effectivement, il doit y avoir d'autre moyen de procéder.
Sinon oui, memcpy est très rapide. Je pense pas qu'on fasse mieux...
Bien sûr que si on fait mieux. memcpy c'est pour le cas général.Sinon oui, memcpy est très rapide. Je pense pas qu'on fasse mieux...
Dans les cas particulier où tu sais que ta mémoire est alignée de telle manière ou que tu un nombre d'objets à copier multiple d'un certain nombre, tu peux aller bien plus vite.
Mais bon, normalement tu n'as pas à copier la mémoire, sauf si tu fais du C. Dans quel cas c'est l'autre forum.
Boost ftw
Au contraire, c'est beaucoup plus clair, puisque tu n'as pas à traiter les cas limites...
Et ce n'est certainement pas de la bricole. Si tu as des invariants, autant les utiliser.
Boost ftw
Désolé de mon absence de réponse... J'ai été réquisitionné ponctuellement sur un autre projet peu après avoir posé ma question.
J'explique dans quel cas je dois effectuer cette copie de zone mémoire.
Je dispose d'un tampon d'image exprimé dans un espace dont le Y va de haut en bas, et je dois transformer ce tampon pour afficher l'image dans un espace dont le Y va de bas en haut.
La première ligne doit donc devenir la dernière, la deuxième la pénultième, etc.
Je fais donc :
BlocWidth / BlocHeight : taille de l'image
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 RV_PIXEL* pixels = new RV_PIXEL[BlocWidth * BlocHeight]; unsigned int index = 0; unsigned int lineSize = BlocWidth*sizeof(RGBAColor); for( y=0, index=0; y<BlocHeight; y++ ) { offset = BlocWidth*(BlocHeight-y-1); memcpy(&(pixels[index]), &(rgba_buffer[offset]), lineSize ); index += BlocWidth; }
pixels / rgba_buffer : pointeurs vers des structures représentant un pixel RGBA
Je n'ai pas le choix sur la nature de pixels : il est imposé par une API C++, pourtant).
rgba_buffer est de mon fait. Je pourrais éventuellement lui donner une coloration plus orientée C++, mais les pixels viennent de toute façon d'un programme C sous forme d'un pointeur sur une zone mémoire.
S'il y a mieux, you're welcome !
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager