Sizeof (struct) возвращает неожиданное значение

Это должно быть просто, но я не знаю, где искать проблему:

У меня есть структура:

struct region
{
public:
    long long int x;
    long long int y;
    long long int width;
    long long int height;
    unsigned char scale;
};

Когда я делаю sizeof(region), он дает мне 40, когда я ожидаю 33.

Любые идеи?

(mingw gcc, win x64 os)

Ответ 1

Он заполняет структуру, чтобы она соответствовала 8-байтовой границе. Таким образом, на самом деле он занимает 40 байт в памяти - sizeof возвращает правильное значение.

Если вы хотите, чтобы он принимал только 33 байта, укажите атрибут packed:

struct region
{
public:
    long long int x;
    long long int y;
    long long int width;
    long long int height;
    unsigned char scale;
} __attribute__ ((packed));

Ответ 2

Значения

long long int равны 8 байтам. scale - только 1 байт, но для выравнивания добавляется, поэтому он также занимает 8 байтов. 5*8 = 40.

Ответ 3

Как отмечалось в других публикациях, структуры выравниваются для выравнивания, и такое заполнение зависит не только от типа членов, но и от порядка членов, в которых они определены.

Например, рассмотрим эти две структуры A и B, как определено ниже. Обе структуры идентичны в терминах членов и типов; единственное отличие состоит в том, что порядок, в котором определены члены, не одинаковый:

struct A
{
    int i;
    int j;
    char c;
    char d;
};

struct B
{
    int i;
    char c;
    int j;
    char d;
};

Будет ли sizeof(A) быть равным sizeof(B) только потому, что у них одинаковое количество членов одного типа? Нет. Попробуйте напечатать размер каждого из них:

cout << "sizeof(A) = "<< sizeof(A) << endl;
cout << "sizeof(B) = "<< sizeof(B) << endl;

Вывод:

sizeof(A) = 12
sizeof(B) = 16

Удивлены? Посмотрите результат самостоятельно: http://ideone.com/yCX4S