🏗 Тетрис в памяти: Почему порядок полей в классе важен?
Вы создали простую структуру:
Математика проста: 1 байт + 4 байта + 1 байт = 6 байт.
Вы проверяете через
Куда делись еще 6 байт? Вы только что потеряли 50% памяти на "воздух".
Это называется Padding (Выравнивание).
⚙️ Как это работает?
Процессор не любит читать данные по произвольным адресам. Ему удобно читать кусками по 4 или 8 байт (слова). Чтобы
❌ Плохой пример (Bad Layout):
✅ Хороший пример (Good Layout):
Просто меняем порядок полей. Правило: "От больших к маленьким".
📉 Почему это важно?
Кажется, что 4 байта ерунда. Но если у вас
⚫️
⚫️
Вы экономите 4 мегабайта просто переставив строчки местами! Плюс, более плотные данные лучше ложатся в кэш процессора (CPU Cache), что ускоряет обработку.
💡 Совет:
Объявляйте поля в порядке убывания их размера:
1. Указатели и
2.
3.
4.
#cpp #optimization #memory #alignment #coding #tips
➡️ @cpp_geek
Вы создали простую структуру:
bool, int и еще один bool.Математика проста: 1 байт + 4 байта + 1 байт = 6 байт.
Вы проверяете через
sizeof и видите... 12 байт. 🤯Куда делись еще 6 байт? Вы только что потеряли 50% памяти на "воздух".
Это называется Padding (Выравнивание).
⚙️ Как это работает?
Процессор не любит читать данные по произвольным адресам. Ему удобно читать кусками по 4 или 8 байт (слова). Чтобы
int (4 байта) не "разломился" посередине двух слов, компилятор вставляет пустые байты-заглушки.❌ Плохой пример (Bad Layout):
struct Bad {
bool a; // 1 байт
// ... 3 байта PADDING (воздух) ...
int b; // 4 байта (должен начинаться с кратного 4 адреса)
bool c; // 1 байт
// ... 3 байта PADDING (чтобы выровнять общий размер) ...
};
// Итог: 12 байт
✅ Хороший пример (Good Layout):
Просто меняем порядок полей. Правило: "От больших к маленьким".
struct Good {
int b; // 4 байта
bool a; // 1 байт
bool c; // 1 байт
// ... 2 байта PADDING (добиваем до кратности 4) ...
};
// Итог: 8 байт
📉 Почему это важно?
Кажется, что 4 байта ерунда. Но если у вас
std::vector<Bad> на 1,000,000 элементов:Bad: ~12 MB памяти.Good: ~8 MB памяти.Вы экономите 4 мегабайта просто переставив строчки местами! Плюс, более плотные данные лучше ложатся в кэш процессора (CPU Cache), что ускоряет обработку.
💡 Совет:
Объявляйте поля в порядке убывания их размера:
1. Указатели и
double (8 байт)2.
int, float (4 байта)3.
short (2 байта)4.
bool, char (1 байт)#cpp #optimization #memory #alignment #coding #tips
➡️ @cpp_geek
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12❤4💯1