Ответ таков: по крайней мере
sizeof(double) + (3*sizeof(int))
Причина, по которой он "по крайней мере" состоит в том, что компилятор более или менее свободен для добавления отступов по мере необходимости базовогоархитектура, чтобы он соответствовал ограничениям на выравнивание.
Допустим, например, что у вас есть машина с 64-битным словом, как старая машина CDC.(Черт, у некоторых из них были 60-битные слова, поэтому было бы еще страннее.) Далее предположим, что на этой машине sizeof(double)
составляет 64 бита, а sizeof(int)
- 16 бит.Компилятор может затем разметить вашу структуру как
| double | int | int | int | 16 bits padding |
, чтобы вся структура могла быть передана через машину в двух ссылках на память, без необходимости сдвигать или путаться.В этом случае sizeof (yourstruct_s) будет 16, где sizeof(double)+ (3*sizeof(int))
равно 48 14.
Обновление
Заметьте, что это также может быть верно и для 32-битной машины: тогда вам может понадобиться заполнение, чтобы оно соответствовало трем словам.Я не знаю современной машины, которая не обращается к байту, поэтому сейчас может быть трудно найти пример, но это может понадобиться группе более старых архитектур.