De http://en.cppreference.com/w/cpp/string/byte/memmove
En dépit d'être spécifié « comme si » un tampon temporaire est utilisé, les mises en œuvre effective de cette fonction n'encourent pas la charge de la double copie ou de la mémoire supplémentaire. Pour un petit compte, il peut charger et écrire des registres; pour les plus gros blocs, une approche courante (glibc et bsd libc) est de copier les octets vers l'avant depuis le début du tampon si la destination commence avant la source, et inversement depuis la fin sinon, avec une retombée sur std :: memcpy Il n'y a pas de chevauchement du tout.
Par conséquent, le surdébit est vraisemblablement un couple de branches conditionnelles. Ne vaut pas la peine de s'inquiéter pour les gros blocs.
Cependant, il est utile de rappeler que std::memcpy
est une fonction «magique», étant la seule façon légale de faire un cast entre deux types dissemblables.
En C++, ce qui est illégal (comportement non défini):
union {
float a;
int b;
} u;
u.a = 10.0;
int x = u.b;
C'est légal:
float a = 10.0;
int b;
std::memcpy(std::addressof(b), std::addressof(a), size(b));
et fait ce que vous attendez le syndicat à faire si vous étiez un programmeur C .
Cela dépend de la machine cible et de l'implémentation. –
Les données de copie sont lentes. Copier les données * deux fois * sera plus lent. Ce 'memmove' * pourrait être plus lent que' memcpy' parce qu'il est capable de gérer la mémoire qui se chevauche, mais 'memmove' copie toujours les données * une fois *. –
profil sur la plate-forme que vous êtes intéressé par les horaires pour. Cependant, les chances de vous écrire un meilleur memmove que Memmove semble improbable. – xaxxon