Dans quelles circonstances dois-je m'attendre à ce que les memcpys surpassent les affectations sur le matériel moderne INTEL/AMD ? J'utilise GCC 4.2.x sur une plateforme Intel 32 bits (mais je suis intéressé par le 64 bits également).
Réponse
Trop de publicités?Vous ne devez jamais vous attendre à ce qu'ils surpassent les affectations. La raison en est que le compilateur utilisera de toute façon memcpy s'il pense que c'est plus rapide (si vous utilisez des drapeaux d'optimisation). Sinon, et si la structure est raisonnablement petite pour tenir dans les registres, la manipulation directe des registres peut être utilisée, ce qui ne nécessite aucun accès à la mémoire.
GCC a des modèles spéciaux de déplacement de blocs en interne qui déterminent quand il faut changer directement les registres / cellules de mémoire, ou quand il faut utiliser la fonction memcpy. Notez que lors de l'assignation du struct, le compilateur sait au moment de la compilation quelle sera la taille du déplacement, de sorte qu'il peut dérouler les petites copies (faire un déplacement n-fois dans la rangée au lieu de boucler) par exemple. Note -mno-memcpy
:
-mmemcpy
-mno-memcpy
Force (do not force) the use of "memcpy()" for non-trivial block moves.
The default is -mno-memcpy, which allows GCC to inline most constant-sized copies.
Qui sait mieux quand utiliser memcpy que le compilateur lui-même ?