Размер структуры в 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можно использовать для определения точного размера структуры.