логическое значение — C ++ sizeof с bool

Это простой вопрос. Код первый.

struct A {
int x;
};
struct B {
bool y;
};
struct C {
int x;
bool y;
};

В основной функции я звоню

cout << " bool : " << sizeof(bool) <<
"\n int : " << sizeof(int) <<
"\n class A : " << sizeof(A) <<
"\n class B : " << sizeof(B) <<
"\n class C : " << sizeof(C) << "\n";

И результат

bool : 1
int : 4
class A : 4
class B : 1
class C : 8

Почему размер класса С 8 вместо 5?
Обратите внимание, что это скомпилировано с gcc в MINGW 4.7 / Windows 7/32-битной машине.

6

Решение

Выравнивание агрегата соответствует выравниванию его самого строгого члена (члена с наибольшим требованием выравнивания). Другими словами, размер структуры кратен выравниванию его самого строгого (с наибольшим требованием выравнивания) члена.

struct D
{
bool a;
// will be padded with char[7]
double b; // the largest alignment requirement (8 bytes in my environment)
};

Размер структуры выше будет 16 байтов, потому что 16 кратно 8. В вашем примере самым строгим типом является int, выравнивающий до 4 байтов. Вот почему структура дополняется до 8 байтов. Я приведу еще один пример:

struct E
{
int a;
// padded with char[4]
double b;
};

Размер структуры выше 16. 16 кратно 8 (выравнивание double в моем окружении).

Я написал сообщение в блоге о выравнивании памяти для более подробного объяснения
http://evpo.wordpress.com/2014/01/25/memory-alignment-of-structures-and-classes-in-c-2/

6

Другие решения

Выравнивание структур по размеру слова, которое здесь составляет 4 байта.

2

Глядя на определение вашей структуры, у вас есть 1-байтовое значение, за которым следует 4-байтовое целое число. Это целое число должно быть расположено на 4-байтовой границе, что заставит компилятор вставлять 3-байтовое заполнение после вашего 1-байтового bool. Что делает размер структуры до 8 байт. Чтобы избежать этого, вы можете изменить порядок элементов в структуре.

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

Ответ от Rohit J на размер структуры отличается от версии typedef?

-1
По вопросам рекламы [email protected]