Все поля выровнены в зависимости от их типа.Собственные типы (int
, byte
и т. Д.) Выровнены по размеру.Например, int
всегда будет кратным 4 байтам, в то время как байт может быть где угодно.
Если поля меньшего размера предшествуют int
, при необходимости будет добавлено заполнение, чтобы обеспечитьint
правильно выровнен до 4 байтов.Вот почему S5
(1 + 1 + 4 = 8) и S8
(1 + 2 + 4 = 8) будут иметь отступы и будут иметь одинаковый размер:
[1][1][ ][ ][4] // S5
[1][ ][ 2 ][4] // S8
Кроме того,Сама struct наследует выравнивание своего наиболее выровненного поля (т. е. для S5
и S8
, int
является наиболее выровненным полем, поэтому оба они имеют выравнивание 4).Выравнивание наследуется таким образом, чтобы при наличии массива структур все поля во всех структурах были правильно выровнены.Таким образом, 4 + 2 = 8.
[4][2][ ][ ] // starts at 0
[4][2][ ][ ] // starts at 8
[4][2][ ][ ] // starts at 16
Обратите внимание, что 4 всегда выравнивается на 4. Без наследования от наиболее выровненного поля, каждый другой элемент в массиве будет иметь int
, выровненный на 6байт вместо 4:
[4][2] // starts at 0
[4][2] // starts at 6 -- the [4] is not properly aligned!
[4][2] // starts at 12
Это было бы очень плохо, потому что не все архитектуры допускают чтение с невыровненных адресов памяти, и даже те, которые имеют (потенциально довольно большой, если на строке или странице кэша)ограничение производительности за это.
Помимо базовой производительности, выравнивание также вступает в игру с параллелизмом.Модель памяти C # гарантирует, что чтение / запись нативных типов шириной до 4 байтов являются атомарными, а .NET имеет атомарные функции, такие как класс Interlocked
.Атомарные операции, подобные этим, сводятся к инструкциям процессора, которые сами по себе требуют выровненного доступа к памяти для работы.
Правильное выравнивание очень важно!
Вы часто будете видеть, как умные нативные кодировщики помнят все это, покавыкладывая их структуры, сортируя все поля от самых больших до самых маленьких, стараясь свести к минимуму заполнение и, следовательно, размер структуры.