2016-11-15 7 views
0

Следующий код дает результат sizeof (t1) = 16 sizeof (t2) = 16 Я бы ожидал sizeof (t2) = 12, потому что sizeof (fpos_t) = 8 и SizeOf (INT) = 4. Может кто-нибудь объяснить это?странный размер результата в MVC (выравнивание?)

int main() 
{ 
    typedef struct { 
     fpos_t fpos; 
     char* s; 
     int a; 
    } t1; 
    typedef struct { 
     fpos_t fpos; 
     int a; 
    } t2; 
    t1 it1; 
    t2 it2; 
    printf("sizeof(t1)=%d sizeof(t2)=%d ", sizeof(t1), sizeof(t2)); 
    return 0; 
} 
+0

Одно слово может объяснить это: * обивка * –

ответ

0

Для alignment reasons компилятор может свободно вставлять прокладку. Это означает, что размер структуры не обязательно равен сумме размеров отдельных членов. Это явно разрешено стандартом C.

Единственное место, где заполнение не допускается в начале структуры i.e перед первым членом.

От C11 draft, 6.7.2.1:

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

(выделено мной).

0

Большинство компьютеров теперь в днях допускают выделение только в словах (ака 8 байтов, ака 64 бит) за раз. Это называется дополнением.

Подумайте об этом как о гостиничных номерах. Несмотря на то, что у вас есть 1 или 2 человека (chars), проживающих в одном и том же номере (memory location), номер будет такого же размера.