Прежде всего, из соображений производительности, заполнение добавляется перед каждым элементом структуры, чтобы выровнять указанный элемент в структуре памяти структуры. Таким образом, ocs2_multisound
, вероятно, имеет перед ним байт заполнения, чтобы гарантировать, что он появляется в количестве байтов в структуре, кратной 2 (потому что int16_t
имеет выравнивание 2).
Кроме того, после всего того, что сделано, общий размер структуры дополняется кратным из его самого строгого требования к выравниванию (т. Е. Самого высокого выравнивания из любого удерживаемого поля). Это так, например, что все элементы массива указанного типа будут правильно выровнены.
Выравнивание типа можно проверить во время компиляции через alignof(T)
, где T
- это тип.
Увеличение размера в этом случае неизбежно, но общий совет для сокращения байтов заполнения состоит в том, чтобы упорядочивать элементы структуры в порядке нисходящего выравнивания. Это связано с тем, что следующий элемент гарантированно будет правильно выровнен без необходимости дополнения, поскольку предыдущее поле имело либо такое же выравнивание, либо более строгое выравнивание. Поэтому, если будет добавлен какой-либо отступ, он будет дополнять только общий размер структуры, а не (впустую) заполнение между полями.
Причиной выравнивания является прежде всего эффективность в наши дни. Чтение невыровненного блока памяти на оборудовании, которое его поддерживает, обычно примерно вдвое медленнее, потому что он фактически читает два блока памяти вокруг него и извлекает то, что ему нужно. Однако есть также оборудование, которое просто не будет работать, если вы попытаетесь прочитать / записать невыровненную память. Такое оборудование обычно вызывает аппаратное исключение в этом случае.