MEMMOVE |
Déplacement de mémoire |
---|---|
Langage C | string.h |
Syntaxe
void *memmove(const void *tampondestination, const void *tamponsource, size_t n); |
Paramètres
Nom | Description |
---|---|
tampondestination | Ce paramètre permet d'indiquer le tampon recevant les données |
tamponsource | Ce paramètre permet d'indiquer le tampon contenant les données à copier |
n | Ce paramètre permet d'indiquer la taille du tampon en octets |
Description
Cette fonction permet de copier un tampon source dans un tampon de destination de «n» octets.
Algorithme
MODULE MEMMOVE(dest, src, n) SI dest < src ou dest ≥ src + n ALORS * Si la zone de destination est avant la source ou qu'elles ne se chevauchent, on peut copier de manière directe (comme memcpy) BOUCLE POUR i ← 0 JUSQU'A n - 1 FAIRE dest[i] ← src[i] FIN BOUCLE POUR SINON * Si la zone de destination chevauche la source, il faut copier en partant de la fin BOUCLE POUR i ← n - 1 DESCENDRE JUSQU'A 0 FAIRE dest[i] ← src[i] FIN BOUCLE POUR FIN SI RETOURNE dest |
Remarques
- Fonction de déplacement de mémoire : La fonction memmove permet de déplacer un bloc de mémoire d'un endroit à un autre, même si les deux zones de mémoire se chevauchent. Contrairement à memcpy, ne gérant pas les chevauchements de mémoire, memmove garantit que les données sont déplacées correctement, même si la zone source et la zone de destination se recouvrent.
- Gestion des chevauchements de mémoire : L'une des caractéristiques principales de memmove est sa capacité à gérer correctement les chevauchements de mémoire entre la source et la destination. Lorsqu'il y a chevauchement, la fonction déplace d'abord les données vers une zone temporaire ou effectue les copies de manière adaptée pour éviter l'écrasement des données encore non copiées.
- Comportement de retour : Le comportement de memmove est similaire à memcpy en termes de déplacement des données, mais elle peut être plus lente en raison de la gestion des chevauchements. La fonction retourne toujours un pointeur vers la destination, ce qui permet d'utiliser cette valeur pour chaîner des opérations ou de vérifier le résultat.
- Application dans des cas de copie partielle : memmove est particulièrement utile lorsque vous avez besoin de déplacer des blocs de mémoire dans des situations où les zones source et destination peuvent se chevaucher. Par exemple, cela peut être important dans des algorithmes où les éléments sont déplacés à l'intérieur d'un même tableau ou lors de la réorganisation de données dans des tampons partagés.
- Différence avec memcpy : Bien que memcpy et memmove aient des comportements similaires, la différence majeure réside dans la gestion des chevauchements. memcpy est plus rapide mais ne gère pas les chevauchements, ce qui peut entraîner une corruption des données si la source et la destination se chevauchent. memmove prend en charge cette situation, mais cela peut la rendre légèrement plus lente.
- Performance : La fonction memmove peut être moins performante que memcpy dans des scénarios où il n'y a pas de chevauchement de mémoire. Cela est dû à la gestion supplémentaire des cas de chevauchement, ce qui implique généralement une copie dans un tampon temporaire ou un autre mécanisme pour éviter les conflits de mémoire. Toutefois, memmove reste plus sûre à utiliser lorsque les chevauchements sont possibles.
- Utilisation dans des applications critiques : Dans des systèmes où les performances sont critiques (par exemple, les systèmes embarqués ou les applications avec des ressources limitées), il est important de bien choisir entre memcpy et memmove en fonction de la possibilité de chevauchement. Si vous savez qu'il n'y a pas de chevauchement, memcpy sera plus rapide, mais dans les cas incertains, memmove sera un choix plus sûr, bien que plus coûteux en termes de performances.
Exemple
Voici quelques exemples typiques de l'utilisation de cette fonction :
Essayer maintenant !
on obtiendra le résultat suivant :
B[0] = 0B[1] = 1
B[2] = 2
B[3] = 3
B[4] = 4
B[5] = 5
B[6] = 6
B[7] = 7
B[8] = 8
B[9] = 9
B[10] = 10
B[11] = 11
Voir également
Langage de programmation - C - Référence de procédures et fonctions - memcpy
Langage de programmation - C - Référence de procédures et fonctions - memset
Langage de programmation - C++ - Référence de procédures et fonctions - memmove
Références
Langage C, Edition Micro-Application, Gehard Willms, 2001, ISBN: 2-7429-2008-0, page 733.
Borland C++ for Windows 4.0, Library Reference, Edition Borland, 1993, Part # BCP1240WW21772, page 176.
Dernière mise à jour : Mardi, le 28 juillet 2015