编译时的 C 数组对齐检查

C array alignment check at compile time

我正在尝试在编译时检查 8 的数组对齐方式。这是代码:

// File scope
uint32_t pool[1024];
bool aligned = (((uintptr_t) pool) % 8) == 0;

我收到此错误:初始化元素在加载时不可计算。但是,当我检查 4 的数组对齐时,我没有得到错误。代码如下:

// File scope
uint32_t pool[1024];
bool aligned = (((uintptr_t) pool) % 4) == 0;

语言:C

工具链:arm-none-eabi-gcc

编译器选项:-mcpu=cortex-m3 -mthumb

为什么会这样?

如果您需要强制执行特定对齐,据报道这适用于 "arm-none-eabi-gcc" 工具链:

uint32_t pool[1024] __attribute__((aligned(8)));

静态变量的地址在编译时是未知的,它只是在稍后由linker决定。 "address of a symbol modulo some arbitrary number" 没有合适的重定位,编译器可以发出作为 linker 修复的初始化值,因此它放弃了。正如汤姆在评论中所说,它 可以 至少假设 linker 不会违反该类型的最低要求对齐方式,因此能够优化在那种情况下表达消失。

我认为您可以按原样实现此目的的唯一方法是将其声明为 extern bool aligned,然后使用一些 linker 脚本黑魔法将其定义为适当的值link次。