C++ libjpeg中的指针对齐

C++ libjpeg中的指针对齐,c++,c,pointers,alignment,libjpeg,C++,C,Pointers,Alignment,Libjpeg,发件人: 有人能解释写两个像素和写两个对齐像素之间的区别吗?如果像素是堆栈分配的uint32\u t和addr&3==0,那么它们不应该等价吗 谢谢 在这两个宏中,唯一重要的对齐方式是addr的对齐方式。如问题中所述,如果addr是32位对齐的,这意味着它的低位两位为零,那么它们是等价的,但前提是目标体系结构也是little endian 在big-endian机器上,必须将像素的上16位写入INT16*addr[0],将下16位写入INT16*addr[1]才能使它们相等 在不检查libjpe

发件人:

有人能解释写两个像素和写两个对齐像素之间的区别吗?如果像素是堆栈分配的uint32\u t和addr&3==0,那么它们不应该等价吗


谢谢

在这两个宏中,唯一重要的对齐方式是addr的对齐方式。如问题中所述,如果addr是32位对齐的,这意味着它的低位两位为零,那么它们是等价的,但前提是目标体系结构也是little endian

在big-endian机器上,必须将像素的上16位写入INT16*addr[0],将下16位写入INT16*addr[1]才能使它们相等

在不检查libjpeg源代码副本的情况下,我猜这些定义可能会作为移植库的一部分被修改,或者它们已经由endianness声明保护


如果addr不是32位对齐的,那么WRITE_TWO_aligned_PIXELS宏可能会导致在不允许未对齐访问的体系结构上引发异常。当然,在某些情况下,允许进行未对齐访问,但比两个较小的对齐访问要昂贵得多,而且在其他一些体系结构上,很难区分未对齐访问和对齐访问


这两个宏提醒库作者考虑对齐问题,并将处理未对齐访问的方法标准化,以便在构建不重要的平台时对其进行优化。

在这两个宏中,唯一重要的对齐是addr的对齐。如问题中所述,如果addr是32位对齐的,这意味着它的低位两位为零,那么它们是等价的,但前提是目标体系结构也是little endian

在big-endian机器上,必须将像素的上16位写入INT16*addr[0],将下16位写入INT16*addr[1]才能使它们相等

在不检查libjpeg源代码副本的情况下,我猜这些定义可能会作为移植库的一部分被修改,或者它们已经由endianness声明保护


如果addr不是32位对齐的,那么WRITE_TWO_aligned_PIXELS宏可能会导致在不允许未对齐访问的体系结构上引发异常。当然,在某些情况下,允许进行未对齐访问,但比两个较小的对齐访问要昂贵得多,而且在其他一些体系结构上,很难区分未对齐访问和对齐访问

这两个宏提醒库作者考虑对齐,并将处理未对齐访问的方法标准化,以便在构建无关紧要的平台时对其进行优化。

写入两个像素和写入两个对齐像素对于小端机器是等效的,但对于大端架构则不是

[示例编辑:感谢Steve Jessop]

Let,像素=0x0A0B0C0D

对于big-endian机器,写入两个像素的操作如下:

---------------------
| 0B | 0A | 0D | 0C |
---------------------
  3    2    1    0          <--- addr
---------------------
| 0D | 0C | 0B | 0A |
---------------------
  3    2    1    0          <--- addr
WRITE_TWO_像素和WRITE_TWO_ALIGNED_像素对于小端机器是等效的,但对于大端结构则不是

[示例编辑:感谢Steve Jessop]

Let,像素=0x0A0B0C0D

对于big-endian机器,写入两个像素的操作如下:

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

第一个不应该是BADC吗?INT16像素,即0xCD,位于右边的较低地址,INT16像素>>16位于左边的较高地址。我可能错了——把较低的地址放在右边会让我头疼-我想你是对的。Endianness是一件令人困惑的事情!我会更新我的答案。第一个答案不应该是BADC吗?INT16像素,即0xCD,位于右边的较低地址,INT16像素>>16位于左边的较高地址。我可能错了——把较低的地址放在右边会让我头疼-我想你是对的。Endianness是一件令人困惑的事情!我将更新我的答案。它会导致抛出异常-甚至更好,显然在某些ARM芯片上,未对齐的访问不会导致硬件异常,它只是默默地读取/写入错误的值。不过,我只在它陷入陷阱的地方使用过ARMs。@Steve Jessop,巧合的是,我刚刚帮助一位同事调试了一个数据包的一个字节不应该为零的地方。结果证明,这是由于对相邻奇数地址的16位写入导致的,该地址显然被静默地向下舍入到对齐地址,从而破坏了相邻字段。这是在专有SOC的ARM内核中。据我们所知,没有抛出异常,有证据表明read返回了写入的值。寓意是,在任何平台上都要小心访问不一致,这始终是一个可移植性问题。它会导致抛出异常-甚至更好,显然在某些ARM芯片上,未对齐的访问不会导致硬件异常,它只是默默地读/写错误的值。我只使用过AR
“我只是帮一个同事调试了一些东西,其中一个数据包的一个字节是零,而它本不应该是零。”。结果证明,这是由于对相邻奇数地址的16位写入导致的,该地址显然被静默地向下舍入到对齐地址,从而破坏了相邻字段。这是在专有SOC的ARM内核中。据我们所知,没有抛出异常,有证据表明read返回了写入的值。寓意是,在任何平台上都要小心访问不一致,这始终是一个可移植性问题。我编辑了我的示例。请再查一下。对不起,我弄错了。我已经编辑了我的示例。请再查一下。我为这个错误感到抱歉。