Почему под параметр-переменную функции выделяется 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.
Что такое фрейм стека и что и как там размещается написано здесь и здесь.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Какие существуют виды рекламных бордов и как выбрать подходящий?
Стоит задача:построить график функции на координатной плоскости при помощи WInApiС WinApi сталкиваюсь первый раз
Нужно удалять файлы, в том числе и файлы "Только чтение"Если в свойствах стоит галочка "Только чтение", то через remove() удалить не получается
Я нашел оболочку для curl и пытаюсь ее "собрать" Что я сделал: