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