【发布时间】:2017-04-13 05:37:32
【问题描述】:
我正在为 Microblaze 处理器使用 GCC 编译器。 最近我遇到了一个变量对齐的问题。我注意到有时编译器会将静态变量分配给未对齐的地址(该地址不能被 4 整除),因此如果我将未对齐变量的指针发送给任何函数,我都会得到未对齐的访问硬件异常。
我有两个关于该主题的问题:
-
如何确保所有静态变量都对齐?有没有强制要求的标志?目前我正在使用变量属性:
__attribute__((aligned(4)))但这很不舒服,因为我需要为我拥有的每个静态变量定义它,这没有意义。
- 有没有办法确保我的函数局部变量(分配在堆栈中)对齐?我的意思是有没有办法确保我的堆栈头对齐,每个函数都使用堆栈的对齐部分,并且在堆栈中分配的任何变量都是对齐的。
谢谢。
【问题讨论】:
-
这听起来像是一个编译器错误。编译器应根据目标架构处理对齐。
-
注意:不要使用存在标准替代方案的编译器扩展。使用
_Alignas说明符(分别是stdalign.h名称)。您可以使用_Alignof检查编译器应该期望的对齐方式。在提交错误报告之前,我会非常彻底地测试这个问题。 -
我已经测试了对齐方式。对于大小为 1 的类型,对齐方式为 1,因此可能会获得未对齐的变量。但我的问题是,是否有一个标志使默认对齐至少为 4,或者类似的东西。
-
你传递给 gcc 的标志是什么?
标签: c gcc memory-alignment compiler-flags microblaze