Это не решит проблемы с выравниванием, поскольку проблем с выравниванием быть не должно - компилятор правильно выровняет ваши локальные переменные, поэтому проблем с выравниванием быть не должно.
Единственная проблема, которая может возникнуть при группировании типов с одинаковым выравниванием , заключается в том, чтобы уменьшить использование стека, но компиляторы могут в любом случае свободно изменять порядок расположения переменных в стеке (или даже повторно использовать местоположения для различных локальных переменные в разное время, или для хранения локальных элементов в регистрах и их отсутствия в стеке), поэтому вы, как правило, ничего не покупаете для оптимизированной компиляции.
Если вы собираетесь «печатать» элементы в стеке, вам нужно будет использовать те же методы для безопасности выравнивания, которые вы использовали бы для данных вне стека - возможно, больше, так как память выделяется malloc()
или new
гарантированно выровнены соответствующим образом для любого типа - эта гарантия не предоставляется для хранилища, выделенного для автоматических переменных.
«Наказание по типу» - это когда вы обходите систему типов. например, путем доступа к байтам в массиве char
как int
путем приведения char*
к int*
:
int x;
char data[4];
fill_data( data, sizeof(data));
int x = *(int*) data;
Поскольку требование выравнивания char[]
может отличаться от int
, вышеуказанный доступ от data
к int*
может быть не «безопасным для выравнивания». Однако, поскольку malloc()
указано для возврата указателей, соответствующим образом выровненных для любого типа, следующие не должны иметь проблем с выравниванием:
int x;
char* pData = malloc( 4);
if (!pData) exit(-1);
fill_data( pData, 4);
x = *(int*) pData;
Тем не менее, обратите внимание, что sizeof(int)
может не иметь значения 4, а типы int
могут быть с прямым или младшим порядком байтов, поэтому в приведенном выше коде все еще есть проблемы с переносимостью, но не проблемы с выравниванием. Существуют и другие способы выполнения типов, в том числе доступ к данным через различные члены union
, но у них могут быть свои собственные проблемы с переносимостью, в частности, то, что доступ к члену, который не был последним записанным членом, является неопределенным поведением.