sizeof (struct) возвращает неожиданное значение - PullRequest
10 голосов
/ 08 апреля 2011

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

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

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)

Ответы [ 3 ]

10 голосов
/ 08 апреля 2011

Он дополняет структуру до 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));
5 голосов
/ 08 апреля 2011

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

Например, рассмотрим эти две структуры 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

5 голосов
/ 08 апреля 2011

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

...