Как правило, процессоры предпочитают, чтобы переменные выравнивались в памяти в месте, кратном их размеру, поэтому четырехбайтовое целое число должно быть в адресе памяти, который делится на четыре, и на восемь байт long
должен находиться по адресу, кратному восьми.
Разработчики языка C # (и C ++) знают это, и они будут вставлять отступы в структуры для обеспечения необходимого выравнивания. Таким образом, фактическое расположение вашей структуры выглядит следующим образом:
public struct NetPoint {
public float lat; // 4 bytes Offset 0
public float lon; // 4 bytes Offset 4
public int alt; // 4 bytes Offset 8
int to_preserve_alignment; // 4 bytes Offset 12
public long time; // 8 bytes Offset 16
}
Вы можете исправить это, сделав long первым значением, как правило, если вы всегда помещаете самые большие значения в начало ваших структур, у вас не будет вставлен отступ для сохранения выравнивания элементов.
Вы также можете исправить это, добавив
[StructLayout(LayoutKind.Sequential, Pack = 4)]
до объявления структуры, но это приведет к неправильному выравниванию long time
, что снижает производительность. На некоторых процессорах это сильно снижает производительность. (Например, ALPHA AXP будет неисправен для смещенных элементов). x86 Процессоры имеют лишь незначительное снижение производительности, но существует опасность того, что будущие процессоры будут иметь значительное снижение производительности, поэтому лучше, если вы можете, правильно спроектировать свои структуры (а не упаковывать их). 1017 *