Вопрос

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

struct {
    double re[2];
};

и

double re[2];

иметь одинаковый размер в C?Разве структура не увеличивает размер?

Это было полезно?

Решение

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

Другие советы

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

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

struct space_filled
{
    char       part0;
    double     part1;
};

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

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

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

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

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

Нет.Struct не увеличивает размер и не имеет каких-либо дополнительных затрат в скомпилированном C.

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

C — чрезвычайно «голый» язык, а это означает, что в нем нет ничего, кроме необходимого.Поэтому спросите себя: «Какие накладные расходы ТРЕБУЮТСЯ для структуры?», и вы их не найдете.

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top