Как работает заполнение структуры? - PullRequest
0 голосов
/ 30 марта 2012

Мой вопрос касается заполнения структуры?Может кто-нибудь сказать мне, что логика за структурой заполнения.

Пример:

Узел структуры {char c1; short s1; char c2; int i1;};

Может любойкто-нибудь скажет мне, как заполнение структуры будет применяться к этой структуре?

Предположение: целое число занимает 4 байта.

Ожидание ответа.

Ответы [ 3 ]

1 голос
/ 30 марта 2012

Как работает заполнение, полностью зависит от реализации.

Для реализаций, где у вас есть двухбайтовые short и четырехбайтовые int, а типы должны быть выровнены по кратному их размеру,у вас будет:

Offset  Var   Size
------  ----  ----
   0     c1      1
   1     ??      1
   2     s1      2
   4     c2      1
   5     ??      3
   8     i1      4
  12    next

Реализация может свободно вставлять заполнение между полями структуры и после последнего поля (но не перед первым полем) по любой причине.Возможность дополнения после структуры важна для выравнивания последующих элементов в массиве.Например:

struct { int i1; char c1; };

может дать вам:

Offset  Var   Size
------  ----  ----
   0     i1      4
   4     c1      1
   5     ??      3
   8    next

Заполнение обычно выполняется, потому что либо выровненные данные работают быстрее, либо выровненные данные недопустимы (некоторые архитектуры ЦП запрещают несогласованный доступ).

0 голосов
/ 30 марта 2012

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

Например, если char занимает 1 байт, short занимает 2 байта и int занимает 4 байта:

structure Node{ 
    char c1;  // 1 byte
              // 1 byte padding (next member requires 2 byte alignment)
    short s1; // 2 bytes
    char c2;  // 1 byte
              // 3 bytes padding (since next member requires 4 byte alignment)
    int i1;   // 4 bytes
};

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

Если вы правильно упаковали эту структуру (переставив порядок элементов), вы можете поместить ее в 8 байтов, а не в 12 байтов (переключая c2 с помощью s1).

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

0 голосов
/ 30 марта 2012

Простого ответа на этот вопрос нет, кроме «Это зависит».

Это может быть всего 8 байтов, при условии двухбайтовых шорт, или 12 байтов, или 42 байтана достаточно странной реализации.Это зависит как минимум от базовой архитектуры, компилятора и флагов компилятора.Обратитесь к руководству по вашему инструменту за информацией.

...