Размер структуры в C++ определяется суммой размеров всех её полей плюс возможное дополнительное пространство, добавляемое для выравнивания (alignment).
Важные моменты
- Размеры полей структуры: Размер структуры включает размеры всех её полей.
- Выравнивание (alignment): Компилятор может добавлять дополнительные байты между полями для обеспечения корректного выравнивания каждого поля в памяти. Выравнивание зависит от архитектуры процессора и компилятора.
- Паддинг (padding): Дополнительные байты, добавляемые для выравнивания, называются паддингом.
Пример структуры и её размера:
#include <iostream>
using namespace std;
struct Example {
char a; // 1 байт
int b; // 4 байта (может потребовать выравнивания на 4-байтную границу)
char c; // 1 байт
};
int main() {
cout << "Size of Example: " << sizeof(Example) << " bytes" << endl;
return 0;
}
В этом примере компилятор может добавить паддинг для выравнивания int b
и char c
. В зависимости от компилятора и архитектуры, размер может быть больше суммы размеров полей. На 32-битной архитектуре размер может быть 12 байт для выравнивания всей структуры до кратного 4.
Пример с выравниванием:
#include <iostream>
using namespace std;
struct AlignedExample {
char a; // 1 байт
// 3 байта паддинга для выравнивания следующего int
int b; // 4 байта
char c; // 1 байт
// 3 байта паддинга для выравнивания структуры до кратного 4
};
int main() {
cout << "Size of AlignedExample: " << sizeof(AlignedExample) << " bytes" << endl;
return 0;
}
Вывод:
Size of AlignedExample: 12 bytes
Оптимизация структуры
Можно реорганизовать поля для уменьшения размера структуры. На 32-битной архитектуре размер может быть уже 8 байт.
#include <iostream>
using namespace std;
struct OptimizedExample {
int b; // 4 байта
char a; // 1 байт
char c; // 1 байт
// 2 байта паддинга для выравнивания структуры до кратного 4
};
int main() {
cout << "Size of OptimizedExample: " << sizeof(OptimizedExample) << " bytes" << endl;
return 0;
}
Вывод:
Size of AlignedExample: 8 bytes
Выводы:
- Размер структуры зависит от выравнивания полей.
- Реорганизация полей может уменьшить размер структуры.
sizeof
можно использовать для определения точного размера структуры.