Читать книгу Ссылки и указатели в C++: от основ к безопасности и современному коду - - Страница 69
ВОДА
ОглавлениеВыравнивание данных подобно правилам парковки: как автомобили ставят на парковке с зазорами (padding), чтобы обеспечить быстрый и безопасный въезд и выезд, так и данные размещают с выравнивающими байтами, чтобы процессор мог эффективно их читать и записывать; без такого выравнивания возникают «пробки» в виде замедления работы или даже «аварии» – неопределённое поведение (undefined behavior).
Ещё пример с несколькими полями:
struct Complex {
char c1; // offset 0, size 1
double d; // alignof=8 → padding 7 байт, offset 8, size 8
char c2; // offset 16, size 1
int i; // alignof=4 → padding 3 байт, offset 20, size 4
// Общий align=8 → padding 4 байт в конце? Нет, sizeof=24 (кратно 8)
};
std::cout << "sizeof(Complex): " << sizeof(Complex) << " (24)" << std::endl;
"Реальный" размер: 1+8+1+4=14, но с padding 24. Оптимизируйте порядок: большие поля сначала.