【问题标题】:alignment of a c array - alignment of array elements is greater than element sizec数组的对齐 - 数组元素的对齐大于元素大小
【发布时间】:2016-12-06 20:52:34
【问题描述】:

考虑以下 C 代码:

typedef __attribute__((aligned(16))) signed int    INT32;

int main(int argc, char* argv[], char* envp[]) 
{
    INT32                   my_array[255];
    return 0;
}

编译返回错误:

alignment_problem.c: In function ‘main’:
alignment_problem.c:7:2:error: alignment of array elements is greater than element size
INT32                   my_array[255];

由于此错误,我的程序无法编译。

有没有一种方法可以定义INT32 以使对齐有效?

我知道clang 编译此代码没有错误,但我想知道是否有办法使用gcc 编译代码。

编辑:问题是,typedef INT32 是一个大程序之一。所以我正在寻找的解决方案是改变INT32的定义,这样程序才能编译运行。

【问题讨论】:

  • 您是否打算让数组的每个元素在 16 字节边界上对齐?
  • 这是一个关于 gcc 的问题。标记它 gcc。

标签: c arrays gcc alignment typedef


【解决方案1】:

错误是因为您尝试对齐 int 而不是数组。您可以选择使用数组中已知数量的元素创建 typedef 并相应地对齐。

typedef signed int  INT32[255] __attribute__((aligned(16)));

int main(int argc, char* argv[], char* envp[]) 
{
    INT32                   my_array;
    return 0;
}

也可以在每次使用需要对齐的数组时进行对齐。

int main(int argc, char* argv[], char* envp[]) 
{
    signed int my_array[255] __attribute__((aligned(16)));
    return 0;
}

【讨论】:

  • 感谢您的回答,但我需要一个不需要更改程序代码的 INT32 的 typedef。这可能吗?
  • 很遗憾你不能,因为 INT32 不是 16 字节长,所以在逻辑上没有办法对齐它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-27
  • 1970-01-01
相关资源
最近更新 更多