Анонимный пользователь
Дополнительно
Как найти размер структуры?
struct a
{
char *c;
char b;
};
Что такое sizeof(a)?
27
8
Я понимаю, что "размер(а) == 8" Ну, на 32-разрядной машине. Общий размер конструкции будет зависеть от упаковки: в моем случае, по умолчанию упаковка 4, так что 'с' занимает 4 байта, 'б' занимает один байт, оставляя 3 дополнительных байта, чтобы довести ее до следующего значения, кратного 4: 8. Если вы хотите изменить эту упаковку, большинство компиляторов есть способ, чтобы изменить его, например, в MSVC:
дает размер(а) == 5. Если вы сделаете это, будьте осторожны, чтобы сбросить упаковка перед любой библиотеке заголовки!
Вопреки тому, что некоторые другие ответы уже сказал, в большинстве систем, в отсутствии опции ПРАГМА или компилятор, размер структуры будет не менее 6 байт и на большинстве 32-разрядных систем 8 байт. Для 64-битных систем, размер может легко быть 16 байт. Выравнивание не вступают в игру; всегда. Значение sizeof единая структура должна быть такой, что массив этих размеров могут быть выделены и отдельные члены массива достаточно выровнены для процессора в вопрос. Следовательно, если размер структуры был 5, а другие предположили, то массив из двух таких структур будет 10 байт, и char указатель на второй элемент массива будет выровнено по нечетным байт, который (на большинстве процессоров) вызывают основным узким местом в производительности.
Если вы хотите считать вручную, размер struct-это просто размер каждого из ее членов данных после учета выравнивания. Там's никакой магии накладные байт для структуры.
Точная стоимость оператор sizeof(а). Вы можете также рискнуть и предположить, что это в данном случае не менее 2 и не более 16.
Это будет зависеть от вашей архитектуры и от того, как она относится к основным типам данных. Это также будет зависеть от того, требует ли система естественного выравнивания.
Я подозреваю, что вы имеете в виду 'struct', а не 'strict', и 'char' вместо 'Char'.
Размер будет зависеть от реализации. На большинстве 32-битных систем, вероятно, будет 5 -- 4 байта для указателя, один для char. Я не думаю, что выравнивание будет играть здесь роль. Если поменять местами 'c' и 'b', то размер может вырасти до 8 байт.
Хорошо, я попробовал (g++ 4.2.3, с опцией -g) и получил 8.
Значение sizeof структуры должны быть 8 байт на 32-х битной системы, так что размер структуры становится кратен 2. Это делает отдельных конструкций, доступных при правильном границы байта, когда массив структур объявляется. Это достигается за счет заполнения структуры с 3 байта в конце.
Если структуры имели указатель объявлен после чар, он все равно будет 8 байт но 3 байт обивка были добавлены, чтобы держать указатель (который является 4-байтовым элемент) выровнены по 4 байтовой границе адресу.
Правило большого пальца заключается в том, что элементы должны быть со смещением, который является несколько их размер в байтах, а сама структура должна быть такого размера, кратного 2.
Я предполагаю, что вы имеете в виду struct, а не strict, но на 32-битной системе это будет либо 5, либо 8 байт, в зависимости от того, заполняет ли компилятор struct.