Dans les deux macros, le seul alignement important est l'alignement de addr
. Comme écrit dans la question, ils sont équivalents si addr
est aligné sur 32 bits (ce qui signifie que ses deux bits faibles sont nuls), mais seulement si l'architecture cible est également little-endian.
Sur une machine big-endian, les 16 bits supérieurs de pixels
doivent être écrits à (INT16*)(addr))[0]
et les 16 bits inférieurs à (INT16*)(addr))[1]
pour qu'ils soient équivalents.
Sans vérifier ma copie du code source libjpeg, j'imagine que ces définitions devraient être modifiées dans le cadre du portage de la bibliothèque, ou qu'elles sont déjà protégées par une déclaration d'endianness. Si addr
n'est pas aligné sur 32 bits, la macro WRITE_TWO_ALIGNED_PIXELS
peut provoquer une exception sur les architectures où l'accès non aligné n'est pas autorisé. Bien sûr, dans certains cas, l'accès non aligné est autorisé, mais il est beaucoup plus coûteux que deux accès alignés plus petits, et sur d'autres architectures, l'accès non aligné est difficile à distinguer de l'accès aligné. Les deux macros existent pour rappeler à l'auteur de la bibliothèque de penser à l'alignement et pour normaliser l'approche de gestion de l'accès désaligné afin qu'il puisse être optimisé lors de la construction pour les plates-formes où cela n'a pas d'importance.
J'ai édité mon exemple. veuillez vérifier à nouveau. Je suis désolé pour l'erreur. – Donotalo