以下代码定义了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 ©It)
{
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-gnueabi
gcc 是为目标构建的 5.3.1 交叉编译器。
谢谢