Вклад структуры в размер шрифта - PullRequest
6 голосов
/ 20 июня 2009

Мне интересно, почему следующие два типа

struct {
    double re[2];
};

и

double re[2];

имеют одинаковый размер в С? Разве структура не добавляет немного размера?

Ответы [ 7 ]

24 голосов
/ 20 июня 2009

Нет, он просто просто объединяет все элементы в один элемент более высокого уровня, размер которого просто складывается из размеров отдельных элементов (плюс некоторые отступы в зависимости от правил выравнивания, но это выходит за рамки этого вопроса).

12 голосов
/ 20 июня 2009

Нет, если это может помочь - нет. С избегает накладных расходов, как чума. И, в частности, в этом контексте он избегает накладных расходов.

Если вы использовали другую структуру, вы можете увидеть разницу:

struct space_filled
{
    char       part0;
    double     part1;
};

Если вашему компьютеру требуется выровнять double по 8-байтовой границе (и sizeof(double) == 8, что является нормальным, но не обязательным для стандарта), то вы обнаружите, что структура занимает 16 байтов.

5 голосов
/ 20 июня 2009

Нет, структура не должна ничего добавлять. В отличие от Java или .NET, где у классов (и структур) есть куча других обязанностей, в C и C ++ они просто контейнеры, используемые для хранения нескольких элементов данных. В C ++ им, возможно, придется хранить vtable для разрешения вызовов виртуальных функций, если таковые существуют, но, как правило, нет, сама структура не имеет накладных расходов.

Единственное исключение:

typedef struct {} empty;
assert(sizeof(empty) > 0);

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

3 голосов
/ 20 июня 2009

Нет. Struct не добавляет никакого размера или накладных расходов в скомпилированном C.

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

C - чрезвычайно «голый» язык, означающий, что ничего не существует, если не требуется. Поэтому спросите себя: «Какие накладные расходы делает struct REQUIRE?», И вы не найдете ничего.

2 голосов
/ 20 июня 2009

Нет, это не так.

Это один из хороших моментов структур (почему они так полезны в программировании TCP / IP старой школы).

Это хороший способ представить структуру памяти / буфера.

0 голосов
/ 20 июня 2009
0 голосов
/ 20 июня 2009

нет типа структуры в C, просто последовательно размещать элементы в памяти

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...