Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> трамплинные функции gcc, в чем разница, генерировать или нет 
V
    Опции темы
null56
Дата 10.10.2013, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 2
Всего: 12



Всем привет

Прочитал одну статью
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 функцию может быть доступен ей самой? или что?
и что собственно сделает сам трамплин?

спасибо
PM MAIL   Вверх
xvr
Дата 10.10.2013, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



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

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

PM MAIL   Вверх
null56
Дата 11.10.2013, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 2
Всего: 12



xvr, 
Цитата

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

я правильно понимаю, что это касается только вызова через указатель? ведь когда был явный вызов, было видно, что никаких трамплинов не генерилось и новый фрейм стека не требовался?
PM MAIL   Вверх
bsa
Дата 11.10.2013, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(null56 @  11.10.2013,  13:14 Найти цитируемый пост)
я правильно понимаю, что это касается только вызова через указатель?
Да. Правильно. Так как неизвестно, кто и когда вызовет эту функцию.
PM   Вверх
null56
Дата 11.10.2013, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 2
Всего: 12



спасибо
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0433 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.