Структура Padding в C - PullRequest
       3

Структура Padding в C

1 голос
/ 19 июня 2011

Если у меня есть определение структуры в C следующего:

typedef struct example 
{
  char c;
  int ii;
  int iii;
};

Что должно быть выделено памяти, когда я объявляю переменную вышеуказанного типа структурыпример ee;

, а также что такое заполнение структуры и есть ли риск, связанный с заполнением структуры?

Ответы [ 2 ]

10 голосов
/ 19 июня 2011

Попробуй.В разных системах он может быть разным.

#include <stdio.h>
#include <stddef.h> /* for offsetof */
struct example { char c; int ii; int iii; };
int main(int argc, char *argv[])
{
    printf("offsetof(struct example, c) == %zd\n", offsetof(struct example, c));
    printf("offsetof(struct example, ii) == %zd\n", offsetof(struct example, ii));
    printf("offsetof(struct example, iii) == %zd\n", offsetof(struct example, iii));
    return 0;
}

Вывод:

offsetof(struct example, c) == 0
offsetof(struct example, ii) == 4
offsetof(struct example, iii) == 8

Обратите внимание, что sizeof(char) == 1, но перед полем ii есть четыре байта.Три дополнительных байта заполнены.Заполнение существует, чтобы удостовериться, что типы данных выровнены по правильным границам для вашего процессора.

Если процессор делает доступ без выравнивания, могут происходить различные вещи:

  • Доступмедленнее (большинство x86)
  • Доступ должен обрабатываться ядром и НЕВЕРОЯТНО медленно (различные PowerPC) (Это приводило к тому, что некоторые компьютерные игры работали очень медленно на быстрых процессорах PPC 603, когда они нормально работали на медленном PPC601 процессор.)
  • Сбой программы (различные SPARC)

Я не знаю никаких известных рисков с заполнением.Единственная проблема, которая действительно возникает, состоит в том, что две программы, скомпилированные с разными компиляторами (GCC против MSVC, как известно, вызывали это), используют разные отступы и не могут совместно использовать структуры.Это также может вызвать сбои, если код из разных компиляторов связан вместе.Поскольку отступы часто задаются платформой ABI, это происходит редко.

0 голосов
/ 19 июня 2011

В обычном 32-битном режиме это должно занимать 12 байтов - поле c будет заполнено.Однако это зависит от архитектуры и компилятора.

Вы всегда можете использовать pragma для компилятора, чтобы объявить выравнивание для структуры (а для некоторых компиляторов измените выравнивание по умолчанию).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...