来自 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 之间的区别吗?如果 pixels 是分配给 uint32_t 和 addr & 3 == 0 的堆栈,它们不应该是等价的吗?
谢谢。
最佳答案
WRITE_TWO_PIXELS
和 WRITE_TWO_ALIGNED_PIXELS
对于小端机器是等效的,但对于大端架构则不是。
[示例编辑:感谢 Steve Jessop]
设,像素 = 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
关于c++ - libjpeg 中的指针对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3782303/