【问题标题】:GNU GCC compiler - aligned attributeGNU GCC 编译器 - 对齐属性
【发布时间】:2018-09-26 08:04:27
【问题描述】:

我正确地得到了对齐警告

cast 增加了目标类型 [-Wcast-align] 所需的对齐方式

由于以下代码,来自 GCC 编译器:

uint8_t array[100];

uint32_t foo;
foo = * ( (uint32_t *) &array[10]);

然后我使用aligned 属性来解决问题:

uint8_t array[100] __attribute__ ((aligned(4)));

uint32_t foo;
foo = * ( (uint32_t *) &array[10]);

尽管有这个技巧,但我还是得到了同样的警告。这是正常的还是警告应该消失?

【问题讨论】:

    标签: c gcc attributes memory-alignment


    【解决方案1】:

    __attribute__ ((aligned(4))) 仅对齐数组的开头,而不是其中的每个元素。

    如果开头对齐并且偏移量为10 且不能被 4 整除,则生成的地址将不会对齐。

    【讨论】:

      【解决方案2】:

      想一想:&array[10] 即使使用__attribute__ ((aligned(4))) 也不会是 4 字节对齐的,因为您正在查看 4 字节对齐数组中的 10 个字节的偏移量。所以在这个例子中你只会得到 2 字节对齐,并且 gcc 发出警告是正确的。尝试使用 12 而不是 10 的索引,警告可能会消失。

      【讨论】:

      • 你说得对数组的索引错误,我一口气写了例子。但是,我尝试使用 4 的索引倍数,但警告仍然存在。也许我应该在意识到管理它们后禁用此类警告。
      • 是的,这在一定程度上取决于编译器和编译器版本——我尝试了各种版本的 gcc 和 clang,得到了各种不同的结果。当然,您可能应该使用联合而不是类型双关语。
      • 能否请您指出一个有价值的例子,说明如何将联合用于我的目的?
      • 你的意思是like that
      • 您可以定义一个联合类型元素,其中联合中有 4 x uint8_t 和 1 x uint32_t,或者如果您只想使用一个固定大小的数组,那么可能更方便有一个包含 uint8_t 数组和 uint32_t 数组的联合体。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      • 2011-02-10
      • 1970-01-01
      • 2011-11-11
      • 1970-01-01
      相关资源
      最近更新 更多