2010-06-18 2 views
0

В следующем фрагменте кода,SizeOf (структура) Путаница

#include<stdio.h> 
typedef struct { 
    int bit1:1; 
    int bit3:4; 
    int bit4:4; 
} node; 

int main(){ 
    node n,n1,n2,ff[10]; 

    printf("%d\n",sizeof(node)); 
    return 0; 
} 

Как предсказать размер структуры?

+5

Почему, по-вашему, вы должны уметь точно его предсказать? –

+0

И почему вы хотите? – 2010-06-18 18:22:09

ответ

9

Вы не можете предсказать его, не зная компилятор и целевую платформу, с которой он компилируется.

0

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

3

Это зависит от платформы и настроек компилятора (упаковка, выравнивание, 32/64 машины)

По словам comp.lang.c FAQ list

«Битовые поля не считается переносимым, хотя они не менее портативный чем другие части языка ».

+1

какая странная цитата ... – jalf

1

Вы увидите, что размер вашей структуры изменяется в зависимости от настроек оптимизации компилятора. Я бы предсказал где-то между 2 и 12 байтами для этой структуры.

Даже при использовании бит-полей, как и вы, вы не всегда можете предсказать, какой размер структуры будет. Компилятор может иметь каждое битовое поле, занимающее полное пространство int или, возможно, только указанные 1 или 4 бита. Использование бит-полей, в то время как оно отлично подходит для хранения в памяти, часто плохо для времени выполнения и размера исполняемого файла.

+0

Я не уверен, что для компилятора было бы законно занимать эту структуру меньше, чем размер int. Он, конечно, не может занимать меньше размера char, так как sizeof (...) должен возвращать целое число. – Stewart

+0

@Stewart: Существуют платформы, на которых 'sizeof (int) == 2'. –

+0

@ Стефен: Не думаю, что я сказал, что нет. Существуют также платформы, где он не кратен восьми бит, и ничто в моем ответе не запрещает это. Ответ предполагает, что компилятор может упаковать структуру только в 4 бита, это то, что я говорил, не может произойти, особенно, поскольку int должен быть не менее 16 бит. – Stewart

3

Непредсказуемый вообще, но практически говоря, он будет чаще встречаться sizeof (int). Который сам очень часто 4; реже 2 и, конечно, 8 раз.

В большинстве случаев битовые поля будут упакованы, и большую часть времени тип int будет иметь 9 или более бит памяти.

+1

int всегда не менее 16 бит, стандарт говорит так (длинный всегда не менее 32, а в C99 мы получаем длинный длинный, который по крайней мере 64, и все они могут быть больше размеров) – Spudd86

0

Добавьте размеры бит-поля, разделите на 8 * sizeof (int) и возьмите потолок этого значения. В вашем примере это будет 4.

+0

Это не имеет никакой логики что угодно ... – SurDin

+0

@SurDin Предполагается, что компилятор плотно заполняет поля и использует блоки размера sizeof (int). – Spudd86

Смежные вопросы