以下代码定义了一个打包(对齐1)结构,其中dwBug
成员未正确对齐。如果通过引用参数的方式将此成员分配给该成员,则该不适用于不支持未对齐访问的体系结构(例如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
gcc是为arm-linux-gnueabi
目标构建的5.3.1交叉编译器。
由于