Ответ таков: минимум
sizeof(double) + (3*sizeof(int))
Причина, по которой это «по крайней мере», заключается в том, что компилятор более или менее свободен добавлять отступы по мере необходимости для базовой архитектуры, чтобы она соответствовала ограничениям выравнивания.
Предположим, например, что у вас есть машина с 64-битным словом, как старая машина CDC. (Черт, у некоторых из них были 60-битные слова, так что это было бы еще более странно.) Далее предположим, что на этой машине sizeof(double)
— это 64 бита, а sizeof(int)
— 16 бит. Затем компилятор может представить вашу структуру как
| double | int | int | int | 16 bits padding |
так что вся структура может быть передана через машину за 2 ссылки на память, без каких-либо сдвигов или возни с необходимостью. В этом случае sizeof(yourstruct_s) будет равен 16, где sizeof(double)+ (3*sizeof(int))
всего лишь 48 14.
Обновить
Обратите внимание, что это может быть верно и для 32-битной машины: тогда вам может понадобиться дополнение, чтобы уместить его в три слова. Я не знаю современной машины, которая бы не адресовала до байта, поэтому сейчас может быть трудно найти пример, но это может понадобиться для множества старых архитектур.
person
Charlie Martin
schedule
02.10.2011
p = 0x1000, p++
является0x1000
, так как постинкремент приводит к старому значению. Это вопрос с подвохом или вы хотели спросить значениеp
послеp++
= результат++p
= результатp + 1
? - person   schedule 02.10.2011p
, и что это C или C++ (поскольку очень немногие другие языки имеют все указатели,struct
иint
), ответ зависит от размера члены структуры, которая определяется реализацией. Ничто не говорит, что int должен быть 4 байта; иногда 2, иногда 8, иногда вообще какой-то другой размер. - person cHao   schedule 02.10.2011p
равноmystruct *
, то при его увеличении к адресу добавляетсяsizeof(mystruct)
. - person cHao   schedule 02.10.2011int
составляет 4 байта, аdouble
— 8, поэтому 4 байта недостаточно, чтобы поместить ее после первой переменной. - person Chris Lutz   schedule 02.10.2011