размер пользовательского класса - PullRequest
3 голосов
/ 22 февраля 2011

почему размер класса cl1 в следующем коде равен 8, а не 5, а размер класса cl2 равен 1?

class cl1 {                                                                                                                                                                               
public:                                                                                                                                                                                   
    int n;                                                                                                                                                                                
    char cb;                                                                                                                                                                              
    cl1();                                                                                                                                                                                
    ~cl1();                                                                                                                                                                               
};                                                                                                                                                                                        

class cl2 {                                                                                                                                                                               
public:                                                                                                                                                                                   
    char cb;                                                                                                                                                                              
    cl2();                                                                                                                                                                                
    ~cl2();                                                                                                                                                                               
};                                                                                                                                                                                        

Ответы [ 5 ]

6 голосов
/ 22 февраля 2011

Компилятор может свободно вставлять заполнение между и после членов класса, чтобы обеспечить правильное выравнивание переменных и т. Д. Именно то, что вставлено, зависит от реализации. В этом случае я бы предположил, что компилятор добавляет 3 байта заполнения после cl1::cb, возможно, чтобы гарантировать, что следующая переменная в памяти выровнена по 4-байтовой границе.

3 голосов
/ 22 февраля 2011

Самый большой член cl1 (n) составляет 4 байта, поэтому размер cl1 дополняется до ближайших 4 байтов (в данном случае 8), так что массив объектов cl1 делаетне создавать n членов, которые не выровнены с 4-байтовыми адресами.Большинство процессоров действительно ненавидят смещенные многобайтовые значения, либо терпящие потери производительности (два цикла памяти для доступа к одному значению), либо прямые сбои (исключения выравнивания).

Нет гарантии, что это будет согласовано от компилятора к компиляторуили с платформы на платформу.

2 голосов
/ 22 февраля 2011

Пока вы исследуете размер структуры и как делается заполнение, позвольте мне рассказать вам одну интересную вещь. Размер структуры зависит не только от элементов , но и от порядка их объявления . Например, размер следующих структур различен, хотя оба имеют одинаковое количество элементов одинаковых типов, единственное различие заключается в порядке их объявления!

struct A
{
  int a;
  char b;
  char c;
};

struct B
{
  char b;
  int a;
  char c;
};

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

Выход:

sizeof(A) = 8
sizeof(B) = 12

Онлайн-демонстрация в Ideone: http://www.ideone.com/8OoxX

2 голосов
/ 22 февраля 2011

Это из-за заполнения структуры компилятором. Если вы хотите удалить отступы, попробуйте #pragma pack (1), и вы должны получить 5 и 1. Как и ожидалось.

2 голосов
/ 22 февраля 2011

Это все из-за заполнения. Более подробную информацию можно найти, например, здесь

Дело в том, что адреса как объекта, так и его членов должны быть правильно выровнены по ОС и аппаратным причинам. Таким образом, результат. Проблема заполнения осложняется тем фактом, что объекты в массиве должны располагаться последовательно, без пробелов между ними, и ALL должно быть правильно выровнено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...