2015-04-25 3 views
6
#include<stdio.h> 

struct A 
{ 
    char  c; 
    double  e; 
    int   s; 
}A; 

int main() 
{ 
    printf("%u\n", sizeof(A)); 
    return 0; 
} 

Он дает выход . Должно ли это быть , если мы рассмотрим внутреннюю прокладку структуры и прокладку структуры в целом?Почему структура прокладки не происходит должным образом?

Я компиляции кода на Ubuntu 14,04 32 бит с GCC 4.8.2.

+2

Почему это должно быть 24? – Mat

+2

'1 + 3pad + 8 + 4 -> 16' Выглядит хорошо 4-байтовое выравнивание ко мне. – chux

+1

Я думаю, что OP ожидал, что double будет выровнен на 8 байтов. – holgac

ответ

12

Ваши расчеты предполагают, что double должен быть выровнен по 8 байт. Это не относится ко всем архитектурам.

На 32-битной x86 Linux с GCC, double будет по умолчанию по 4 байт. Вы можете изменить это с помощью флага -malign-double, чтобы выровнять его по 8 байт.

Таким образом, расположение по умолчанию предполагая, на 32-битной x86 Linux:

char  // 1 byte 
      // 3 byte padding 
double  // 8 bytes 
int  // 4 bytes 

Так в общей сложности 16 байт, с 3-мя байтами заполнения в середине.

В статье Data structure alignment в Википедии есть номера размеров/выравнивания для различных типов на 32-битных x86 и 64-битных x86_64 в нескольких компиляторах/средах.

+0

Я никогда не слышал о выравнивании байтов раньше. Почему C-структуры делают это? –

+0

@Patrick. Вы можете прочитать, как cpu получает доступ к памяти. Погугли это. – JagsVG

+0

Добавлена ​​ссылка на статью в Википедии. Короткая версия: процессоры нуждаются в этом. Неудачные обращения либо невозможны, либо медленны @PatrickRoberts – Mat

Смежные вопросы