Ответ 1
Некоторые типы данных должны быть выровнены с определенной границей. Так, например:
struct V
{
char a;
double b;
char c;
double d;
};
sizeof (char) равен 1, а sizeof (double) равно 8, но размер этой структуры может быть больше, чем ожидаемый 18, если ему нужно удвоить, чтобы выровнять по 8-байтовой границе. В этом случае и потому, что члены должны появляться в памяти в том порядке, в котором они объявлены в структуре, может быть 7 байтов "заполнения", близких к члену c, и, возможно, некоторых с элементом a.
Опасность здесь возникает, когда упаковка нестандартная, поэтому размер этой структуры может меняться, и вы отправляете ее в "двоичном" формате по проводу или храните ее в файле, где он будет читаться в другом месте (даже если конечная точка двойника одинакова).
В качестве альтернативы предложениям по устранению предупреждения через прагмы вы можете решить использовать его в коде, изменив порядок своих членов. Поместите те, которые нуждаются в наибольшем выравнивании сначала, а нижние - позже. Итак, сначала наведите указатели и двойники, затем введите ints, затем shorts и любые члены char.