2017-02-18 6 views
-1

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

struct toCheckSize 
{ 
    int a; 
    char b; 
}; 

struct toCheckSize v,w,z; 

Так каков размер выделенной памяти для v, w, z? Согласно компилятору, он говорит, что размер v, w, z равен 8.

+0

[Иллюстративная программа.] (Http://ideone.com/JMGNhP) – jxh

+0

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

ответ

-1

Размер структуры зависит от размера целого в вашей системе. Размер целочисленного значения равен Определенная реализация. Но учитывая, что размер, который вы видите для структуры, - 8. Я бы предположил, что sizeof(int) == 4. Тогда размер следующим образом

{ 
    int a, --> 4 bytes 
    char b, --> 1 byte 
      --> padding 3 bytes 
} 
+0

также зависит от требований к выравниванию целых чисел. –

0

размера любого типа данных зависит от поставщиков считают SizeOf (INT) = 4 байта и SizeOf (Char) = 1 байт

int main() 
    { 
      struct ex//ex is tag for this structure 
     { 
      char c; 
      int i; 

     };//this is the just declaration that ex tag is of the form 
     struct ex x,y,z;//memory will be allocated here 

     printf("%u %u %u\n",x,y,z); 
     printf("%u %u %u\n",&x,&y,&z); 
     printf("%u %u %u\n",sizeof(x),sizeof(y),sizeof(z)); 
     printf("%u %u %u\n",sizeof(x.i),sizeof(y.i),sizeof(z.i)); 
     printf("%u %u %u\n",sizeof(x.c),sizeof(y.c),sizeof(z.c)); 
     return 1; 
} 

Выход

See the output of this program

Здесь для заполнения символа добавляется, чтобы удовлетворить заданную константу который также поставщики зависимой

Но увидеть следующий код:

struct record 
{ 
    int id; 
    char name[20]; 
    float salary; 
}; 
struct record student; 

SizeOf (студент); ====> 28bytes. , потому что нет необходимости добавлять отступы для символьного массива

-2

Прокладка используется для выравнивания памяти. Современные процессоры работают лучше, обращаясь к выровненной памяти, используя упаковку по умолчанию. Но вы можете использовать struct __attribute__((__packed__)) toCheckSize, чтобы структура упакована с точным размером. См. Также Structure padding and packing

+0

1) Это был не вопрос GCC. 2) Как вы знаете, что у его платформы есть поддержка для несвязанных доступов? –