Подтвердить что ты не робот

Как найти размер структуры?

struct a
{
    char *c;
    char b;
};

Что такое sizeof (a)?

4b9b3361

Ответ 1

#include <stdio.h>

typedef struct { char* c; char b; } a;

int main()
{
    printf("sizeof(a) == %d", sizeof(a));
}

Я получаю "sizeof (a) == 8" на 32-битной машине. Общий размер структуры будет зависеть от упаковки: в моем случае по умолчанию упаковка равна 4, поэтому "c" занимает 4 байта, "b" принимает один байт, оставляя 3 байта заполнения, чтобы довести его до следующего кратного 4: 8. Если вы хотите изменить эту упаковку, большинство компиляторов имеют способ ее изменить, например, на MSVC:

#pragma pack(1)
typedef struct { char* c; char b; } a;

дает sizeof (a) == 5. Если вы это сделаете, будьте осторожны с упаковкой reset перед любыми заголовками библиотеки!

Ответ 2

Вопреки тому, что говорили некоторые другие ответы, в большинстве систем, в отсутствие параметра прагмы или компилятора, размер структуры будет не менее 6 байтов, а в большинстве 32-битных систем - 8 байтов, Для 64-битных систем размер может быть легко равен 16 байтам. Согласование вступает в игру; всегда. Размер одной структуры должен быть таким, чтобы можно было выделить массив этих размеров, и отдельные члены массива достаточно выровнены для рассматриваемого процессора. Следовательно, если размер структуры равен 5, как предполагают другие, тогда массив из двух таких структур будет иметь длину 10 байтов, а указатель char во втором элементе массива будет выровнен по нечетному байту, который будет ( на большинстве процессоров) вызывают серьезное узкое место в производительности.

Ответ 3

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

Ответ 4

Точное значение sizeof (a).
Вы также можете взять на себя риск и предположить, что в этом случае не менее 2 и не более 16.

Ответ 5

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

Ответ 6

Я предполагаю, что вы имеете в виду структуру, а не строгую, но в 32-битной системе это будет либо 5, либо 8 байтов, в зависимости от того, компилятор заполняет структуру.

Ответ 7

Я подозреваю, что вы имеете в виду "struct", а не "strict" и "char" вместо "char".

Размер зависит от реализации. В большинстве 32-битных систем для указателя, вероятно, будет 5-4 байта, один для char. Я не верю, что вступление здесь в действие. Однако, если вы поменяли 'c' и 'b', размер может увеличиться до 8 байтов.

Хорошо, я попробовал (g++ 4.2.3, с опцией -g), и я получил 8.

Ответ 8

Размер структуры должен быть 8 байтов в 32-битной системе, так что размер структуры становится кратным 2. Это делает отдельные структуры доступными при правильных байтовых границах при объявлении массива структур. Это достигается добавлением структуры с 3 байтами в конце.

Если у структуры был указатель, объявленный после char, он все равно будет иметь размер 8 байтов но добавление 3 байтов было бы добавлено, чтобы сохранить указатель (который представляет собой элемент 4 байта), выровненный по границе 4 байтов.

Правило большого пальца состоит в том, что элементы должны иметь смещение, которое является кратным их размеру байта, а сама структура должна иметь размер, который кратен 2.