Почему размер объекта класса различается в зависимости от порядка членов? - PullRequest
4 голосов
/ 30 декабря 2010
class CHaraICICCC
{
int i;
char c1;
int j;
char c2;
char c3;
char c4;
};

class CHaraIICCCC
{
int i;
int j;
char c1;
char c2;
char c3;
char c4;
};

void fun()
{
    CHaraICICCC eici;
    CHaraIICCCC eiicc;

    int icic = sizeof(eici); // -> output of icic is 16.
    int iicc = sizeof(eiicc); // -> output of icic is 12.
}

Если кто-нибудь знает, Пожалуйста, дайте мне знать, почему так. Спасибо Hara

Ответы [ 3 ]

8 голосов
/ 30 декабря 2010

Из-за выравнивания. Компиляторы x86 склонны выравнивать типы int на границе 4 байта (для более быстрого доступа к памяти), поэтому CHaraICICCC, вероятно, будет выглядеть так:

byte  0: \
byte  1: | <--- int i
byte  2: |
byte  3: /  
byte  4: <----- char c1
byte  5: \
byte  6: | <--- Padding (wasted bytes)
byte  7: / 
byte  8: \
byte  9: | <--- int j  
byte 10: |
byte 11: /
byte 12: <----- char c2
byte 13: <----- char c3
byte 14: <----- char c4

всего 15 байтов, в то время как CHaraIICCCC будет:

byte  0: \
byte  1: | <--- int i
byte  2: |
byte  3: /  
byte  4: \
byte  5: | <--- int j 
byte  6: |
byte  7: /
byte  8: <----- char c1
byte  9: <----- char c2
byte 10: <----- char c3
byte 11: <----- char c4

всего 12 байт (без байтов, потраченных на заполнение). Конечно, это сильно связано с компилятором и зависит от ваших параметров компиляции.

1 голос
/ 30 декабря 2010

Растягивая вопрос "почему" немного, я думаю Я где-то читал, что причина выравнивания в том, что он позволяет процессору игнорировать биты данных - если известно, что ваши данные равны 8-байт выровнен, например, процессор может просто игнорировать 3 младших бита адреса, что повышает эффективность.Я могу ошибаться, но если я правильно помню, вот почему процессоры требуют или предпочитают выравнивание.

0 голосов
/ 30 декабря 2010

В режиме упаковки по умолчанию в большинстве архитектур элементы будут выровнены со смещением (от начала структуры), кратным их размеру.

Если необходимо, будут добавлены байты заполнения.в структуру, чтобы получить это выравнивание.

Итак, при условии упаковки по умолчанию и 4-байтовых целых чисел, ваша первая структура действительно такая:

class CHaraICICCC
{
    int i;
    char c1;
    char padding[3];
    int j;
    char c2;
    char c3;
    char c4;
};
...