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

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

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

Комментарии к вопросу (1)
#include 

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

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

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

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

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

Комментарии (4)

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

Комментарии (2)

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

Комментарии (0)

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

Комментарии (1)

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

Комментарии (0)

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

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

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

Комментарии (1)

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

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

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

Комментарии (1)

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

Комментарии (0)