Страницы

Поиск по вопросам

суббота, 30 ноября 2019 г.

О чём говорит предупреждение о выравнивании данных?

#cpp #память #gcc #выравнивание


При компиляции такого кода для ARM

char* c = 0;
int* p = reinterpret_cast(c);


GCC выводит предупреждение


  cast from ‘char*’ to ‘int*’ increases required alignment of target type


Какими последствиями чревато подобное применение reinterpret_cast для типов с разными
требованиями по выравниванию? Почему такое предупреждение возникает не на всех платформах?
О чём вообще это, нужно ли как-то исправлять?

https://godbolt.org/g/VGDK3w

По ссылке выше вы увидете попытку компиляции такого кода для процессоров x86_64 и
ARM. Несмотря на одинаковые флаги компилятора, результат получился разным.
    


Ответы

Ответ 1



Поведение reinterpret_cast в этом случае зависит от платформы. Начиная с С++11 поведение такого преобразования определяется как int* p = static_cast(static_cast(c)); и результат будет зависеть от поведения внешнего static_cast. Поведение static_cast из void * в объектный указательный тип является неспецифицированным, если исходный void * адрес не удовлетворяет требованиям выравнивания целевого типа. На одной платформе приведение типа от указателя с более расслабленными требованиями выравнивания к указателю с более строгими требованиями выравнивания может привести к потере оригинального адресного значения, т.е. компилятор и/или аппаратура насильно выравняют указатель. На другой платформе адресное значение указателя сохранится, но при попытке доступа через невыровненный указатель программа будет аварийно остановлена. На третьей платформе адресное значение указателя сохранится, но при доступе через невыровненный указатель такой доступ будет производиться успешно, но менее эффективно. На четвертой платформе не будет вообще никаких негативных последствий. Предупреждение о выравнивании данных может либо говорить том, что подобные проблемы могут иметь место на вашей платформе, либо просто являться педантичным "предупреждением портабельности", т.е. говорить том, ваш код может вести себя по-другому на других платформах.

Комментариев нет:

Отправить комментарий