Я получаю предупреждение «увеличение литья требует выравнивания целевого типа» при компиляции следующего кода для ARM.изменение требования к выравниванию при литье
char data[2] = "aa";
int *ptr = (int *)(data);
Я понимаю, что требование выравнивания для символа равно 1 байту, а значение int - 4 байта и, следовательно, предупреждение.
Я попытался изменить выравнивание символа с помощью выровненного атрибута.
char data[2] __attribute__((aligned (4)));
memcpy(data, "aa", 2);
int *ptr = (int *)(data);
Но предупреждение не исчезает.
Мои вопросы
Почему не предупреждение уйти?
Поскольку ARM генерирует аппаратное исключение для неправильных доступов, я хочу убедиться, что проблемы выравнивания не возникают. Есть ли другой способ написать этот код, чтобы проблема выравнивания не возникла?
Кстати, при печати alignof (данные), он печатает 4, что означает, выравнивание данных изменяется.
Я использую gcc версию 4.4.1. Возможно ли, что gcc выдаст предупреждение, даже если выравнивание было изменено с помощью атрибута aligned?
Помните, что на большинстве платформ 'int' 32 бита , четыре байта. Ваша строка - всего два байта (три - это строковый ограничитель). –
@JoachimPileborg - Да, поэтому я хочу избавиться от этого предупреждения. Если строка начинается с нечетной границы, это может привести к исключению без выравнивания. – linuxfreak
Возможный дубликат [ARM unaligned доступ к памяти обходной путь] (http://stackoverflow.com/questions/5119496/arm-unaligned-memory-access-workaround) –