Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > аргументы функции в стеке


Автор: GQU 13.8.2014, 15:59
почему функции в стек передают аргументы справа на лево??

Автор: feodorv 13.8.2014, 16:37
Цитата(GQU @  13.8.2014,  16:59 Найти цитируемый пост)
почему функции в стек передают аргументы справа на лево?? 

Совершенно не обязательно: http://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D0%B3%D0%BB%D0%B0%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE_%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%D0%B5.


Для cdecl это так. И связано с поддержкой в языке C функций с переменным числом переменных. То есть передача аргументов в функции реализована одинаково как для функций с фиксированным числом аргументов, так и для функций с переменным числом аргументов. На момент создания языка C такая идея смотрелась хорошо.

Автор: math64 14.8.2014, 07:31
В согдашении о вызовах указано в каком порядке агрументы будут лежать в стеке и какая сторона ответственна за их освобождение.
В зависимости от версии компилятора, стек может заполняться как слева направо, так и справа налево.
При этом соглашение будет соблюдаться в обоих случаях.

Автор: GQU 15.8.2014, 13:33
Цитата

В зависимости от версии компилятора, стек может заполняться как слева направо, так и справа налево.

А если слева на право, тогда вроде как невозможна будет поддержка функций с переменный числом аргументов, вроде printf, а Си без эгого не Си

Автор: tzirechnoy 18.8.2014, 13:38
Возможна, только тогда надо в соглашэнии указать, что число аргументов как-то передаётся.

Автор: math64 18.8.2014, 17:37
При вызове prinf() и подобных функций известно число агрументов, внутри printf() - не известно, поэтому ответственна за освобождение памяти вызывающая функция.
В новых компиляторах память под аргументы вызываемых функций выделяется при входе в функцию и указатель стека не дёргается. Аргументы заполняются слева направо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)