Выравнивание указателя в libjpeg - PullRequest
1 голос
/ 24 сентября 2010

С jmorecfg.h :

#define PACK_TWO_PIXELS(l,r)   ((r<<16) | l)
#define PACK_NEED_ALIGNMENT(ptr) (((int)(ptr))&3)
#define WRITE_TWO_PIXELS(addr, pixels) do {     \
         ((INT16*)(addr))[0] = (pixels);        \
         ((INT16*)(addr))[1] = (pixels)>>16;    \
    } while(0)
#define WRITE_TWO_ALIGNED_PIXELS(addr, pixels)  ((*(INT32*)(addr)) = pixels

Может кто-нибудь объяснить разницу между WRITE_TWO_PIXELS и WRITE_TWO_ALIGNED_PIXELS?Если пикселям назначен стек uint32_t и addr & 3 == 0, разве они не должны быть эквивалентными?

Спасибо.

Ответы [ 2 ]

2 голосов
/ 24 сентября 2010

WRITE_TWO_PIXELS и WRITE_TWO_ALIGNED_PIXELS эквивалентны для машин с прямым порядком байтов, но не для архитектуры с прямым порядком байтов.

[Пример отредактирован: спасибо Стиву Джессопу]

Позвольте, пикселей = 0x0A0B0C0D

Для машин с прямым порядком байтов WRITE_TWO_PIXELS работает следующим образом:

---------------------
| 0B | 0A | 0D | 0C |
---------------------
  3    2    1    0          <--- addr

где WRITE_TWO_ALIGNED_PIXELS напишет следующее:

---------------------
| 0D | 0C | 0B | 0A |
---------------------
  3    2    1    0          <--- addr
2 голосов
/ 24 сентября 2010

В двух макросах имеет значение только выравнивание addr.Как написано в вопросе, они эквивалентны, если addr выровнен по 32-битам (то есть его младшие два бита равны нулю), но только если целевая архитектура также имеет младший порядок.

На большойВ порядке байтов, старшие 16 бит pixels должны быть записаны в (INT16*)(addr))[0], а младшие 16 бит (INT16*)(addr))[1], чтобы они были эквивалентными.

Не проверяя мою копию исходного кода libjpeg, я бы предположил, что эти определения либо должны быть изменены как часть переноса библиотеки, либо они уже защищены объявлением порядка байтов.

Если addr не выровнен по 32-битному типу, то макрос WRITE_TWO_ALIGNED_PIXELS может привести к возникновению исключения на архитектурах, где не выровненный доступ не разрешен.Конечно, в некоторых случаях разрешен не выровненный доступ, но он намного дороже, чем два меньших выровненных доступа, а в некоторых других архитектурах не выровненный доступ трудно отличить от выровненного доступа.напоминание автору библиотеки подумать о выравнивании и стандартизировать подход к обработке несовпаденного доступа, чтобы его можно было оптимизировать при сборке для платформ, где это не имеет значения.

...