Простой ответ: это не 24 байта. Или вы работаете на 64-битном порту s390 Linux, для которого я не смог найти документацию по ABI. Каждое другое 64-разрядное оборудование, на котором может работать Debian, будет иметь размер этой структуры как 16 байт.
я откопал в документации ABI для связки различных АБИС процессора и все они имеют более или менее эта формулировка (кажется, все они копировали друг от друга):
Структуры и объединения предположим, выравнивание их наиболее строго выровненного компонента. Каждому члену присваивается самое низкое доступное смещение с соответствующим выравниванием. Размер любого объекта всегда кратен выравниванию объекта.
И все архитектуры ABI документы, которые я нашел (MIPS64, ppc64, amd64, ia64, sparc64, arm64) имеют выравнивание полукокса 1, короткий 2, внутр 4 и долго долго 8.
Даже если операционная системам разрешено создавать свои собственные ABI, почти каждая unix-подобная система и особенно Linux следуют System V ABI и их дополнительной документации по ЦП, которая очень хорошо описывает это поведение. И Debian определенно не изменит это поведение, чтобы быть отличным от всех других Linux.
Вот быстрая проверка (все на amd64/x86_64, который является то, что вы, скорее всего, работает):
$ cat > foo.c
#include <stdio.h>
int
main(int argc, char **argv)
{
struct {
long long ll;
char ch2;
char ch1;
short s;
int i;
} foo;
printf("%d\n", (int)sizeof(foo));
return 0;
}
MacOS:
$ cc -o foo foo.c && ./foo && uname -ms
16
Darwin x86_64
Ubuntu:
$ cc -o foo foo.c && ./foo && uname -ms
16
Linux x86_64
CentOS:
$ cc -o foo foo.c && ./foo && uname -ms
16
Linux x86_64
OpenBSD:
$ cc -o foo foo.c && ./foo && uname -ms
16
OpenBSD amd64
Там что-то еще не так с вашей компиляции. Или это не та структура, которую вы тестируете, или вы работаете на очень странной аппаратной архитектуре и указав ее как «64-битный», эквивалентно тому, что я говорю «Я управляю этим правительством, и у него очень странное ускорение и двигатель вырезается через 5 минут »и не упоминает, что вы говорите о космическом челноке.
Вы проверяете это на 64-битной системе? Вы также можете проверить смещения членов, чтобы узнать, где они находятся, используя макрос ['offsetof'] (http://en.cppreference.com/w/c/types/offsetof). Что касается вашей формулировки в названии, выравнивание, выбранное компилятором, безусловно, «правильно» для вашей системы. –
Из-за обивки. – bitcell
Что такое «64-разрядная система»? Какова аппаратная архитектура? В x86_64 ABI размер этой структуры должен быть 16 байтов. Я проверял Ubuntu, MacOS, OpenBSD и Centos. Это не зависит от компилятора, поэтому есть что-то очень неправильное с вашими флагами компиляции, или вы работаете на альфе или что-то странное. – Art