【发布时间】:2012-01-04 19:03:20
【问题描述】:
我今天遇到了类似于以下的代码,我很好奇实际发生了什么:
#pragma pack(1)
__align(2) static unsigned char multi_array[7][24] = { 0 };
__align(2) static unsigned char another_multi_array[7][24] = { 0 };
#pragma pack()
在 Keil 编译器中搜索对 __align 关键字的引用时,我遇到了这个:
执行区域和输入部分的过度对齐 在某些情况下,您想要过度对齐代码和数据部分...如果您可以访问原始源代码,则可以在编译时使用__align(n) 关键字...
我不明白“过度对齐代码和数据部分”是什么意思。有人可以帮助澄清这种过度对齐是如何发生的吗?
【问题讨论】:
-
Overalighment 在 ARM 上可能有用。 “立即加载” (MOV) 指令无法加载整个 32 位值。相反,它可以一次加载 8 位,旋转到任何位置。出于这个原因,您的代码可能会尝试使地址以更多的零位结尾,从而使编译后的代码更容易/更快地将指针值加载到它。