Как найти размер структуры?
struct a
{
char *c;
char b;
};
Что такое sizeof (a)?
Ответы
Ответ 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.