Mui*_*uis 4 embedded arm structure memory-alignment cortex-m
我刚刚发现ARM我正在编写代码(Cortex M0),不支持未对齐的内存访问.
现在在我的代码中我使用了很多打包结构,而且我从来没有得到任何警告或硬错误,那么当它不允许未对齐访问时,Cortex如何访问这些结构的成员?
像gcc这样的编译器了解对齐,并会发出正确的指令来解决对齐问题.如果你有一个打包结构,你会告诉编译器它,所以它提前知道如何进行对齐.
假设您使用的是32位体系结构,但struct其包含的内容如下:
struct foo __attribute__((packed)) {
unsigned char bar;
int baz;
}
Run Code Online (Sandbox Code Playgroud)
进行访问时baz,它将在32位边界上执行内存加载,并将所有位移位.
在这种情况下,它可能是地址的bar32位加载和地址bar+4 的32位加载.然后它将应用一系列逻辑运算,如shift和逻辑或/和最终得到正确的的值baz在32位寄存器.
看看装配输出,看看它是如何工作的.您会注意到,未对齐访问的效率低于这些体系结构上的对齐访问.