Это из-за дополнения добавленного для удовлетворения ограничений выравнивания. выравнивание Структуры данных влияние и производительность и правильность программ:
SIGBUS
). Вот пример с помощью типичных настроек для x86 процессора (все использовали режимы на 32 и 64 бита):
struct X
{
short s; /* 2 bytes */
/* 2 padding bytes */
int i; /* 4 bytes */
char c; /* 1 byte */
/* 3 padding bytes */
};
struct Y
{
int i; /* 4 bytes */
char c; /* 1 byte */
/* 1 padding byte */
short s; /* 2 bytes */
};
struct Z
{
int i; /* 4 bytes */
short s; /* 2 bytes */
char c; /* 1 byte */
/* 1 padding byte */
};
const int sizeX = sizeof(struct X); /* = 12 */
const int sizeY = sizeof(struct Y); /* = 8 */
const int sizeZ = sizeof(struct Z); /* = 8 */
можно минимизировать размер структур путем сортировки участников по выравниванию (сортирующий по размеру, достаточен для этого в основных типах) (как структура Z
в примере выше).
ВАЖНОЕ ПРИМЕЧАНИЕ: И C и стандарты C++ указывают, что выравнивание структуры определяется реализацией. Поэтому каждый компилятор может принять решение выровнять данные по-другому, приведя к различным и несовместимым форматам данных. Поэтому при контакте с библиотеками, которыми будут пользоваться различные компиляторы, важно понять, как компиляторы выравнивают данные. Некоторые компиляторы имеют настройки командной строки и/или особенный #pragma
операторы для изменения настроек выравнивания структуры.
Это была проблема безопасности ...
В com.liferay.portlet.expando.service.impl .ExpandoValueServiceImpl.getData (String className,