2013-11-25 6 views
3

У меня есть код struct iof_header в моем коде, и я определил, что он будет шириной 24 байта. Я выполняю sizeof (iof_header) и возвращает 32 байта в ширину.Как хранится структура в памяти?

Вопрос 1 Почему это ширина 32 байта вместо 24?

Вопрос 2 Включая его элементы, как хранится память в памяти?

Вопрос 3 Я нахожу в любое время я создаю один из моих структур, что байты [4-8 & 20-24] все NULL, я вижу это проявляется в моем массиве символов. Массив читается следующим образом: {4 bytes of BASEID_Code, 4 NULL bytes, 8 bytes of zeroed padding, 4 bytes of ASID_Code, 4 NULL bytes, 8 bytes of size} На концах моих unsigned __int32 есть NULL байты, почему это происходит?

Возможно, это связано с компиляцией? Возможно ли эффективность, позволяющая процессору быстрее обрабатывать эти типы данных?

struct      iof_header 
{ 
    union 
    { 
     struct 
     { 
      unsigned __int32  BASEID_Code; 
      unsigned __int64  padding; 
      union 
      { 
       char     ASID_Type[4]; 
       unsigned __int32  ASID_Code; 
      }; 
      unsigned __int64  Size; 
     }header; 
     char     header_c[24]; 
    }; 
    iof_header() 
    { 
     header.ASID_Code = 0; 
     header.BASEID_Code = 0; 
     header.Size = 0; 
     header.padding = 0; 
    } 
}; 
+10

Как может «объединение» чего-то и 'char [32]' иметь размер меньше 32 байтов? –

+1

Пойдите, прочитайте это для exlanation -http: //en.wikipedia.org/wiki/Data_structure_alignment – OldProgrammer

+0

Об этом спрашивали и ответили уже миллион раз. Все три вопроса. Который вы должны были разместить отдельно, если вообще. –

ответ

5

Почему это ширина 32 байта вместо 24?

Возможно, потому, что перед каждым членом __int64 добавляется дополнение для удовлетворения их требований к выравниванию.

Включая его элементы, как хранится память в памяти?

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

Некоторые компиляторы имеют нестандартное расширение, чтобы «упаковать» элементы, так что прокладка не вставлена. Например, на GCC вы можете поместить __attribute__((packed)) после определения структуры.

Возможно, что эффективность процессора позволяет обрабатывать эти типы данных быстрее?

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

+0

Спасибо, это помогло мне понять многое. Я исправил некоторые из них, выполнив проб и ошибок. –

2

Компилятор может бесплатно добавлять байты после элементов для сохранения требований к выравниванию. Ваши члены __int64, вероятно, выровнены с 8 байтами, ergo - 4 байта заполнения между BASEID_Code и padding.

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