J'utilise memcpy pour copier à la fois des tailles de données variables et des données de taille fixe. Dans certains cas, je copie de petites quantités de mémoire (seulement une poignée d'octets). Dans GCC, je me souviens que memcpy était un intrinsèque/intégré. Profilage de mon code cependant (avec valgrind) Je vois des milliers d'appels à la fonction "memcpy" réelle dans la glibc.un memcpy optimisé pour des données de petite taille ou de taille fixe dans gcc
Quelles sont les conditions à remplir pour utiliser la fonction intégrée? Je peux lancer mon propre memcpy rapidement, mais je suis sûr que le builtin est plus efficace que ce que je peux faire. REMARQUE: Dans la plupart des cas, la quantité de données à copier est disponible en tant que constante de compilation.
CXXFLAGS: -O3 -DNDEBUG
Le code J'utilise maintenant, ce qui oblige builtins, si vous enlevez le _ préfixe builtin la fonction interne n'est pas utilisé. Ceci est appelé à partir de divers autres modèles/fonctions en utilisant T = sizeof (type). Les tailles qui sont utilisées sont 1, 2, multiples de 4, quelques tailles de 50-100 octets, et certaines structures plus grandes.
template<int T>
inline void load_binary_fixm(void *address)
{
if((at + T) > len)
stream_error();
__builtin_memcpy(address, data + at, T);
at += T;
}
Fonctionne bien pour moi avec gcc 4.4.1 dès que j'active l'optimisation (-O1). C'est, memcpy est en ligne. Pouvez-vous fournir un petit code simple, et dire quels commutateurs de compilateur vous utilisez? – davmac
Ne pas profiler votre code (pour cela, je veux dire). Regardez le démontage pour un petit mémcpy spécifique, voyez ce qu'il fait. Même avec l'intrinsèque, la memcpy de la bibliothèque pourrait bien être appelée pour des tailles grandes ou variables. –
@Steve, je ne vois aucune raison pour laquelle valgrind signalerait "memcpy" étant appelé si elle n'était pas appelée. Je sais que le memcpy peut toujours être appelé, mais pour ma situation, il ne devrait pas l'être. –