В двух макросах имеет значение только выравнивание addr
.Как написано в вопросе, они эквивалентны, если addr
выровнен по 32-битам (то есть его младшие два бита равны нулю), но только если целевая архитектура также имеет младший порядок.
На большойВ порядке байтов, старшие 16 бит pixels
должны быть записаны в (INT16*)(addr))[0]
, а младшие 16 бит (INT16*)(addr))[1]
, чтобы они были эквивалентными.
Не проверяя мою копию исходного кода libjpeg, я бы предположил, что эти определения либо должны быть изменены как часть переноса библиотеки, либо они уже защищены объявлением порядка байтов.
Если addr
не выровнен по 32-битному типу, то макрос WRITE_TWO_ALIGNED_PIXELS
может привести к возникновению исключения на архитектурах, где не выровненный доступ не разрешен.Конечно, в некоторых случаях разрешен не выровненный доступ, но он намного дороже, чем два меньших выровненных доступа, а в некоторых других архитектурах не выровненный доступ трудно отличить от выровненного доступа.напоминание автору библиотеки подумать о выравнивании и стандартизировать подход к обработке несовпаденного доступа, чтобы его можно было оптимизировать при сборке для платформ, где это не имеет значения.