1

以下代码定义了dwBug成员未正确对齐的打包(对齐 1)结构。如果通过引用参数将此类成员分配给,则在不支持未对齐访问的体系结构(例如 ARM)上分配失败。

我不能 100% 确定我所做的是否合法;然而,我的理解是,除非我明确地强制转换,否则编译器应该跟踪它是否可以按原样复制数据,或者它必须解决未对齐的访问。即使有-Wall

#include <stdint.h>
#include <stdio.h>

#pragma pack(1)
typedef struct {
    uint16_t w1;
    uint32_t dwBug;
} STest;
#pragma pack()

class CTest
{
public:
    void testIt()
    {
        copyUnaligned(member.dwBug);
        printf("%08x\n", member.dwBug);
    }

private:
    void copyUnaligned(uint32_t &copyIt)
    {
        copyIt = 0x12345678;
    }

    STest member;
};

int main(int, char **)
{
    CTest test;

    test.testIt();
}

这段代码的输出是00001234

# cat /proc/cpuinfo
model name      : ARM926EJ-S rev 5 (v5l)
Features        : swp half fastmult edsp java
CPU implementer : 0x41
CPU architecture: 5TEJ
CPU variant     : 0x0
CPU part        : 0x926
CPU revision    : 5

arm-linux-gnueabigcc 是为目标构建的 5.3.1 交叉编译器。

谢谢

4

0 回答 0