c++ - libjpeg 中的指针对齐

标签 c++ c pointers alignment libjpeg

来自 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_PIXELSWRITE_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/

相关文章:

c++ - C++对vtable的 undefined reference 在编译时

android - Qt Android x86_64 支持

c - 将内存分配给C中的字符串数组

java - 在java中初始化对象A等于另一个对象B

javascript - 在 JavaScript 中将参数作为指针传递

c++ - 错误 R6010,当我想使用我的网络摄像头时。为什么叫它?

c++ - Qt中如何访问其他类的对象?

c - 当我尝试编译时,我得到了预期的 * 但参数类型为 **,并且警告传递参数不兼容的指针类型

c - 如果换行符出现在空格之后,我在使用 scanf() 获取换行符时遇到问题

c - 输出使用 char * 指向 int 数组