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


Автор: null56 10.10.2013, 15:35
Всем привет

Прочитал одну статью
http://www.technovelty.org/c/gcc-trampolines.html
в которой обсуждается пример вложенных (nested) функций.
сначала показывается прямой вызов nested функции и через указатель.
в первом случае трамплин не генерится, всё типа хорошо, кроме того, что мы по прежнему остаемся в стеке родительской функции.
во втором примере мы вызываем nested функцию через указатель и тут генерится трамплин

помогите понять фразу автора
Цитата

So why do we need a trampoline? Because a nested function has an extra property over a normal function; the stack pointer must be set to be the stack pointer of the function it is nested within. This means that if we were to pass around pointers to the nested function, we would have to keep track that this isn't a pointer to just any old function, but a pointer to special function that needs its stack setup to come from the nested function. C doesn't work like this, there is only one type "pointer to function".


не понимаю чем чревато отсутствие трамплина во втором случае? то что указатель на саму nested функцию может быть доступен ей самой? или что?
и что собственно сделает сам трамплин?

спасибо

Автор: xvr 10.10.2013, 18:54
Цитата(null56 @  10.10.2013,  15:35 Найти цитируемый пост)
не понимаю чем чревато отсутствие трамплина во втором случае?

Автор говорит, что 'вложенной функции' недостаточно просто ее адреса. Она должна быть вызванна с указателем стека, который показывает в фрейм охватывающей функции. Соотвественно, что бы правильно вызвать вложенную функцию, необходимо не только иметь указатель на нее, но и иметь указатель стекового фрейма, где ее надо вызвать. К сожалению в С нет понятия 'указатель на вложенную функцию' (с неявным дополнительным параметром - стековым фреймом), а есть просто 'указатель на функцию'. У него этого дополнительного параметра нет, так чо приходится делать трамплин, что бы он смог вычислить недостающий указатель на фрейм и установить его, перед вызовом

Автор: null56 11.10.2013, 12:14
xvr, 
Цитата

Автор говорит, что 'вложенной функции' недостаточно просто ее адреса

я правильно понимаю, что это касается только вызова через указатель? ведь когда был явный вызов, было видно, что никаких трамплинов не генерилось и новый фрейм стека не требовался?

Автор: bsa 11.10.2013, 12:41
Цитата(null56 @  11.10.2013,  13:14 Найти цитируемый пост)
я правильно понимаю, что это касается только вызова через указатель?
Да. Правильно. Так как неизвестно, кто и когда вызовет эту функцию.

Автор: null56 11.10.2013, 13:21
спасибо

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