Размер структуры в C++ определяется суммой размеров всех её полей плюс возможное дополнительное пространство, добавляемое для выравнивания (alignment).

Важные моменты

  1. Размеры полей структуры: Размер структуры включает размеры всех её полей.
  2. Выравнивание (alignment): Компилятор может добавлять дополнительные байты между полями для обеспечения корректного выравнивания каждого поля в памяти. Выравнивание зависит от архитектуры процессора и компилятора.
  3. Паддинг (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 можно использовать для определения точного размера структуры.