Попробуй.В разных системах он может быть разным.
#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, это происходит редко.