在施法时改变对齐要求

时间:2014-09-15 07:03:04

标签: gcc casting arm memory-alignment

我收到警告"施法增加了目标类型所需的对齐"同时为ARM编译以下代码。

char data[2] = "aa";
int *ptr = (int *)(data);

据我所知,char的对齐要求是1个字节,int的对齐要求是4个字节,因此是警告。

我尝试使用aligned属性更改char的对齐方式。

char data[2] __attribute__((aligned (4)));
memcpy(data, "aa", 2);

int *ptr = (int *)(data);

但警告并没有消失。

我的问题是

  1. 为什么警告没有消失?

  2. 由于ARM为未对齐的访问生成硬件异常,我想确保不会发生对齐问题。有没有其他方法来编写此代码,以便不会出现对齐问题?

  3. 顺便说一句,当我打印 alignof (数据)时,它会打印4,这意味着数据的对齐方式会发生变化。

    我使用的是gcc 4.4.1版。即使使用对齐属性更改了对齐,gcc是否可能发出警告?

1 个答案:

答案 0 :(得分:4)

我不太明白你为什么要这样做...但问题是字符串文字“aa”没有存储在对齐的地址。编译器可能完全优化了变量data,因此只将代码视为int* ptr = (int*)"aa";,然后给出错位警告。摆弄data变量的任何数量都不会改变文字“aa”的对齐方式。

为了避免在未对齐的地址上分配文字,您必须调整字符串文字在编译器设置中的存储方式,这可能不是一个好主意。

另请注意,指向指向字符串文字的非常量数据是没有意义的。

所以你的代码是无稽之谈。如果您仍然因为未知的原因而坚持使用指向字符串文字的int指针,那么我会做一些解决方法,例如:

typedef union
{
  char arr[3];
  int  dummy;
} data_t;

const data_t my_literal = { .arr="aa" };
const int* strange_pointer = (const int*)&my_literal;