Просто чтобы добавить к отличному ответу Бена:
Определение элементов структуры в том же порядке, в котором они впоследствии будут доступны в вашем приложении, уменьшит промахи в кэше и, возможно, повысит производительность. Это будет работать при условии, что вся структура не помещается в кэш L1.
С другой стороны, упорядочивание членов от большего к меньшему может уменьшить общее использование памяти, что может быть важно при хранении массива небольших структур.
Предположим, что для архитектуры (я их не так хорошо знаю, думаю, что это было бы так для дефолтных настроек 32bit gcc, кто-то меня поправит в комментариях) такая структура:
struct MemoryUnused {
uint8_t val0;
uint16_t val1;
uint8_t val2;
uint16_t val3;
uint8_t val4;
uint32_t val5;
uint8_t val6;
}
занимает 20 байт в памяти, а это:
struct MemoryNotLost {
uint32_t val5;
uint16_t val1;
uint16_t val3;
uint8_t val0;
uint8_t val2;
uint8_t val4;
uint8_t val6;
}
Потребуется 12. Это 8 байтов, потерянных из-за заполнения, и это на 67% больше размера структуры меньшего размера. При большом массиве таких структур выигрыш будет значительным и, просто из-за объема используемой памяти, уменьшит количество промахов кеша.
person
Dariusz
schedule
02.01.2014