Память, выделенная для структур - PullRequest
1 голос
/ 31 декабря 2010

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

typedef struct EData
{
    int a;
    char c;
}
Edata obj;

a - целочисленная переменная, поэтому она занимает 4 байта, а c - переменная char, поэтому она занимает 1 байт, всего 5 байтов

Но когда я печатаю sizeof(obj), он показывает 8 байтов .

В чем причина?

Ответы [ 4 ]

4 голосов
/ 31 декабря 2010

Поскольку в 32-битных системах память выровнена по границам 4byte (32bit), поэтому она должна быть кратна 4 байтам, см. Data structure alignment

3 голосов
/ 31 декабря 2010

int - 4 байта, char - 1 байт. Однако ваш компилятор выравнивает каждый struct по слову (слово составляет 4 байта в 32-битной архитектуре), поскольку это повышает производительность. Поэтому каждый экземпляр EData будет округлен до 2 слов (или 8 байтов).

То, что вы в конечном итоге, выглядит примерно так:

typedef struct EData {
    int a;
    char c;
    char padding[3];
}
1 голос
/ 31 декабря 2010

Увеличение размера, которое вы заметили, связано с дополнением компилятора.
Компилятор добавляет дополнительные байты для обеспечения правильных границ байтов.
Таким образом, компилятор добавляет дополнительные байты для обеспечения правильного расположения каждого элемента в соответствии с его типом.
Существует возможность остановить компилятор, чтобы сделать это (упакованная директива), но лучше избегать этого (за исключением угловых случаев)

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

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

...