Вопрос по c, struct – Вклад структуры в размер шрифта

6

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

struct {
    double re[2];
};

а также

double re[2];

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

Ваш Ответ

7   ответов
0
12

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

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

struct space_filled
{
    char       part0;
    double     part1;
};

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

@Jonathan: Я уверен, что это не так, поэтому компилятор мог бы заказывать автоматику, как ему хотелось бы, если бы захотел, сэкономить место. Фактически, до тех пор, пока указатель на автомат не покидает локальную область видимости, я не думаю, что автоматика вообще должна быть в стеке - компилятор может хранить их в регистрах, если он этого хочет. Я думаю.
Не обязательно - если бы был другой символ, или short, или int, или по одному из каждого в последовательности (при довольно нормальных предположениях о размере), тогда не было бы пробела. Но в отсутствие такого «наполнителя» переменные, вы правы. (И я не думаю, что стандарт C гарантирует, что локальные переменные будут расположены в любом конкретном порядке относительно друг друга.)
Символ & amp; double, объявленный отдельно, все равно будет занимать такое же количество места, как и там. Это просто невидимое пространство стека. Но по адресам предметов бы раскрыли прокладки.
23

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

Для эффекта выравнивания в структурах см.unidata.ucar.edu/blogs/default/2009/03/30/1238442300000.html
+1 за упоминание выравнивания.
0

ти

5

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

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

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

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

+1 за упоминание пустой структуры.
2

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

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

3

мпилированном C.

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

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

Похожие вопросы