2008-09-27 4 views

ответ

0

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

0

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

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

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

+1

выравнивание * might * входить в игру. – jop 2008-09-27 05:04:51

1

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

2

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

+0

Хотя теоретически нет верхнего предела, поскольку реализация и размер указателей являются специфичными для компилятора при условии, что они ведут себя в соответствии со стандартом. – Skizz 2009-02-18 15:13:17

9

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

+0

И на старых 68к маках, авария! – 2008-09-27 05:14:39

+0

Причина, по которой я предположил, что выравнивание не будет иметь эффекта, состоит в том, что оба члена будут правильно выровнены без заполнения между ними. Я не ожидал, что sizeof будет учитывать заполнение в конце. Моя гипотеза была опровергнута экспериментально, как я заметил в своем ответе. – 2008-09-27 05:16:58

32
#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. Если вы сделаете это, будьте осторожны сбросьте упаковку перед любыми заголовками библиотеки!

+3

Чтобы убедиться, что он работает: printf ("sizeof (a) ==% d", (int) sizeof (a)); ' – 2008-10-05 18:03:25

0

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

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

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

4

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

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