我正在尝试在编译时检查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
为什么会这样?
答案 0 :(得分:5)
如果您需要强制执行特定的对齐,则报告这适用于“arm-none-eabi-gcc”工具链:
uint32_t pool[1024] __attribute__((aligned(8)));
答案 1 :(得分:3)
静态变量的地址在 compile 时间是不知道的,它仅在后来由链接器决定。对于以某个任意数字为模的符号的地址,没有合适的重定位"编译器可以发出作为链接器修复的初始化值,因此它放弃了。正如汤姆在评论中所说,可以至少假设链接器不会违反该类型所需的最小对齐,因此能够在这种情况下优化表达式。
我认为你可以实现这一目标的唯一方法就是将其声明为extern bool aligned
,然后使用一些链接描述黑魔法在链接时用适当的值定义它。