2013-05-18 8 views
1

У меня проблемы с динамическим распределением памяти. Как-то, фактический размер моей структуры (сумма всех частей) меньше размера самого типа. Вот код:Размер и распределение памяти

#include <stdio.h> 
#include <malloc.h> 

struct Lol { 
    int a; 
    char b; 

    char s[20]; 
}; 

void main() { 

    Lol* lol = (Lol*)malloc(sizeof(Lol)); 

    printf("Type size: %d bytes\n", sizeof(Lol)); 
    printf("Actual struct size: %d bytes\n", sizeof(lol -> a) + sizeof(lol -> b) + sizeof(lol -> s)); 

} 

в этом размере случае структура должен быть 25 байт (4 байта для междунар, 1 байт для полукокса и 20 байт массивов символов), но SizeOf (Lol) показывает мне 28 по какой-то причине как и тип char, будет рассматриваться как тип int. Что случилось с этим? Означает ли это, что я теряю 3 байта на ничего?

ответ

1

фактического размера моей структуры (сумма всех частей) меньше, чем размер самого типа»

Поскольку многие компьютерные операции выполняются быстрее, когда значения они работают на выравниваются по определенной памяти границы, стандарт языка C позволяет реализациям выполнять такое выравнивание. В большинстве систем ints будет выровняться по границам 4 или 8 байтов в зависимости от размера int. Размер структуры должен быть выровнен так, чтобы адрес следующей структуры в массиве будет правильно выровнена, поэтому структура, начинающаяся с int, выровненной с 4-байтовой границей, должна иметь размер, который кратен 4.

Означает ли это, что я потерял 3 байта на ничего?

Да. (Ну, это не совсем так ... Ваша программа, как правило, будет быстрее из-за этого.) С современными машинами, поддерживающими до 2 терабайт оперативной памяти, это меньше беспокоит, чем когда-то было.

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