Размер переменных в функциях

258
01 апреля 2019, 08:20

Почему под параметр-переменную функции выделяется 4 байта оперативной памяти, если тип short (2 байта)?

По просьбе dgzargo

Answer 1

Во-первых, в таком коде скорее всего под параметры вообще не будет выделена никакая память - параметры будут размещены в регистрах процессора.

Во-вторых, даже если ваша реализация решит разместить параметры в памяти, скорее всего она выровняет их либо на границу нативного слова вашей платформы, либо (еще вероятнее) на границу типа int.

Особенностью варианта с выравниванием на границу типа int является совместимость со "старинными" соглашениями, принятыми для вызова необъявленных функций в языке С: аргументы типа short порождают параметры типа int. Скорее всего это и является одним из доминирующих факторов в данном случае. Совместимость с соглашениями о передаче параметров языка С практически ничего не стоит, а заниматься какой-то ненужной "упаковкой параметров" только для С++ никакого смысла нет.

По этой же самой причине даже аргументы типа char будут передаваться как полноразмерные int, а аргументы типа float - как double.

P.S. Вас и не должно интересовать, сколько памяти было выделено под передачу ваших параметров. Это не имеет никакого значения. Внутри функции ваши параметры будут вести себя, как значения типа short, и их начальные значения будут переданы правильно.

Answer 2

В Вашем случае параметры передаются через стек. А так как программа тридцати-двух битная то и квант стека соответственный. О передаче параметров в Visual Studio написано здесь и здесь.

On x86 plaftorms, all arguments are widened to 32 bits when they are passed.

Что такое фрейм стека и что и как там размещается написано здесь и здесь.

READ ALSO
Построить график функции с++ (WinAPi)

Построить график функции с++ (WinAPi)

Стоит задача:построить график функции на координатной плоскости при помощи WInApiС WinApi сталкиваюсь первый раз

225
Как изменить свойства файла С++

Как изменить свойства файла С++

Нужно удалять файлы, в том числе и файлы "Только чтение"Если в свойствах стоит галочка "Только чтение", то через remove() удалить не получается

169
Как поставить библиотеку С++ без или с Cmake

Как поставить библиотеку С++ без или с Cmake

Я нашел оболочку для curl и пытаюсь ее "собрать" Что я сделал:

160