Почему под параметр-переменную функции выделяется 4 байта оперативной памяти, если тип short (2 байта)?
По просьбе dgzargo
Во-первых, в таком коде скорее всего под параметры вообще не будет выделена никакая память - параметры будут размещены в регистрах процессора.
Во-вторых, даже если ваша реализация решит разместить параметры в памяти, скорее всего она выровняет их либо на границу нативного слова вашей платформы, либо (еще вероятнее) на границу типа int.
Особенностью варианта с выравниванием на границу типа int является совместимость со "старинными" соглашениями, принятыми для вызова необъявленных функций в языке С: аргументы типа short порождают параметры типа int. Скорее всего это и является одним из доминирующих факторов в данном случае. Совместимость с соглашениями о передаче параметров языка С практически ничего не стоит, а заниматься какой-то ненужной "упаковкой параметров" только для С++ никакого смысла нет.
По этой же самой причине даже аргументы типа char будут передаваться как полноразмерные int, а аргументы типа float - как double.
P.S. Вас и не должно интересовать, сколько памяти было выделено под передачу ваших параметров. Это не имеет никакого значения. Внутри функции ваши параметры будут вести себя, как значения типа short, и их начальные значения будут переданы правильно.
В Вашем случае параметры передаются через стек. А так как программа тридцати-двух битная то и квант стека соответственный. О передаче параметров в Visual Studio написано здесь и здесь.
On x86 plaftorms, all arguments are widened to 32 bits when they are passed.
Что такое фрейм стека и что и как там размещается написано здесь и здесь.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей