ответ
Я предполагаю, что вы имеете в виду структуру, а не строгую, но в 32-битной системе это будет либо 5, либо 8 байт, в зависимости от того, компилятор заполняет структуру.
Я подозреваю, что вы имеете в виду «struct», а не «strict» и «char» вместо «Char».
Размер зависит от реализации. В большинстве 32-битных систем для указателя, вероятно, будет 5-4 байта, один для символа. Я не верю, что вступление здесь в действие. Однако, если вы поменяли 'c' и 'b', размер может вырасти до 8 байтов.
Хорошо, я попробовал его (г ++ 4.2.3, с опцией -g), и я получаю 8.
выравнивание * might * входить в игру. – jop 2008-09-27 05:04:51
Это будет варьироваться в зависимости от архитектуры и как она относится основные типы данных. Это также будет зависеть от того, требует ли система естественного выравнивания.
Точное значение sizeof (a).
Возможно, вы также рискуете и предположите, что он в этом случае не менее 2 и не более 16.
Хотя теоретически нет верхнего предела, поскольку реализация и размер указателей являются специфичными для компилятора при условии, что они ведут себя в соответствии со стандартом. – Skizz 2009-02-18 15:13:17
Вопреки тому, что говорили некоторые другие ответы, в большинстве систем, при отсутствии pragma или compiler, размер структуры будет не менее 6 байтов, а в большинстве 32-разрядных систем - 8 байтов. Для 64-битных систем размер может быть легко равен 16 байтам. Согласование вступает в игру; всегда. Размер одной структуры должен быть таким, чтобы можно было выделить массив этих размеров, и отдельные члены массива достаточно выровнены для рассматриваемого процессора. Следовательно, если размер структуры равен 5, как предполагают другие, тогда массив из двух таких структур будет иметь длину 10 байтов, а указатель char во втором члене массива будет выровнен по нечетному байту, который будет (на большинстве процессоры) вызывают серьезное узкое место в производительности.
И на старых 68к маках, авария! – 2008-09-27 05:14:39
Причина, по которой я предположил, что выравнивание не будет иметь эффекта, состоит в том, что оба члена будут правильно выровнены без заполнения между ними. Я не ожидал, что sizeof будет учитывать заполнение в конце. Моя гипотеза была опровергнута экспериментально, как я заметил в своем ответе. – 2008-09-27 05:16:58
#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 (а) == 5. Если вы сделаете это, будьте осторожны сбросьте упаковку перед любыми заголовками библиотеки!
Чтобы убедиться, что он работает: printf ("sizeof (a) ==% d", (int) sizeof (a)); ' – 2008-10-05 18:03:25
Размер структуры должен быть 8 байтов в 32-битной системе, так что размер структуры становится кратным 2. Это делает отдельные структуры доступными с правильными границами байтов при объявлении массива структур. Это достигается добавлением структуры с 3 байтами в конце.
Если структура была указана после символа, она будет по-прежнему иметь размер 8 байт , но добавление 3 байтов было бы добавлено для сохранения указателя (который является 4-байтным элементом), выровненного на 4 байт адресная граница.
Правило большого пальца состоит в том, что элементы должны иметь смещение, которое является кратным размеру их байтов, а сама структура должна иметь размер, который кратен 2.
Если вы хотите вручную подсчитать его, размер структуры будет равен размеру каждого из его элементов данных после учета выравнивания. Для структуры нет магических служебных байтов.
- 1. Как уменьшить размер структуры
- 2. Размер структуры?
- 3. Размер структуры
- 4. Размер структуры
- 5. Размер структуры
- 6. Размер структуры
- 7. Размер структуры с вектором
- 8. Как установить размер вложенной структуры?
- 9. Размер структуры в C
- 10. размер структуры C
- 11. Размер структуры в Go
- 12. размер структуры массива
- 13. размер C структуры
- 14. Размер общей структуры
- 15. Каков размер этой структуры?
- 16. Фиксированный размер структуры
- 17. размер структуры в C
- 18. Получить размер структуры, переданной как функция void
- 19. Как найти функцию внутри структуры
- 20. Как найти размер RDD
- 21. Как найти размер матрицы?
- 22. Как найти размер файла
- 23. Как найти размер массива?
- 24. C: Структуры: Как назначить размер массива при создании экземпляра структуры?
- 25. Получить размер структуры в C#
- 26. Как изменить размер массива структуры в C#
- 27. Как компилятор определяет размер структуры битового поля?
- 28. Как вы инициализируете размер и длину структуры
- 29. Как определить размер структуры в C
- 30. Как изменить размер структуры с помощью malloc
`sizeof (a)` недействителен C. Все еще это было бы допустимо в C++. – alk 2017-07-30 14:21:08