![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
Tulsky |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 7.12.2005 Репутация: нет Всего: нет |
Объясните пожалуйста что происходит с inline функцией на уровне машинных команд.
|
|||
|
||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
я так полагаю, код функции генерируется в месте ее вызова
-------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
Partizan |
|
|||
![]() Let's do some .NET ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2828 Регистрация: 19.12.2005 Где: Санкт-Петербург Репутация: 4 Всего: 67 |
а? что значит на уровне машинных команд?
inline означает то, что в программе при компиляции вместо вызовов функции будет вставлен её код(скорее всего)...inline говорит компилятору сгенерить код функции в месте её вызова... то есть если мы inline функцию вызвали 4 раза то в 4 местах вставится код этой функции... за счёт этого увеличивается размер прогшраммы и её производительность... но в основном компиляторы игнорируют inline в объявлении функций, за исключением самых малых... -------------------- СУВ, Partizan. |
|||
|
||||
BreakPointMAN |
|
||||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 15.9.2004 Где: Saratov Репутация: 14 Всего: 24 |
О'кей, рассмотрим на простом примере. C++ Builder 6, Console Application, Release-версия.
...и-и-и во что это превратилось: Функция main:
Функция sum:
Если бы функция sum была inline, то мы получили бы следующее:
Как видно, во втором случае sum не оформлена в виде отдельной функции, а "встроена" в main... ![]() -------------------- "Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце") |
||||||||
|
|||||||||
Fin |
|
|||
![]() Дракон->Спать(); ![]() ![]() Профиль Группа: Участник Сообщений: 687 Регистрация: 4.1.2006 Репутация: 3 Всего: 10 |
Стоить добавить только, что inline функции компилятор отрабатывает только в релиз режиме. В Дебаг режиме, он игнорирует слово inline.
-------------------- Пролетал мимо. |
|||
|
||||
Tulsky |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 7.12.2005 Репутация: нет Всего: нет |
А книжку про все эти дела некто не подскажет?
|
|||
|
||||
_hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 16 Всего: 98 |
любая книжка по асму ( не справочник )
потом любая старая книжка по С ( не С++ ) -------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
BreakPointMAN |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 15.9.2004 Где: Saratov Репутация: 14 Всего: 24 |
"Фундаментальные основы хакерства. Искусство дизассемблирования." © Крис Касперски - в книге есть раздел "Идентификация встраиваемых (inline) функций". Но не думаю, что тебе это много даст. Еще можешь на форум http://wasm.ru/forum заглянуть. Кажется, я там недавно видел вопрос по автоматическому поиску inline-функций в коде, может для себя что полезное найдешь...
Это сообщение отредактировал(а) BreakPointMAN - 6.2.2006, 11:59 -------------------- "Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце") |
|||
|
||||
Tulsky |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 7.12.2005 Репутация: нет Всего: нет |
Не уверен, что в C был inline, но всё же какую книгу по окнкретней вы можете посоветовать? |
|||
|
||||
_hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 16 Всего: 98 |
были. как же без них:
http://www.greenend.org.uk/rjk/2003/03/inline.html ( в качестве примера ) а насчет книги... я ж говорю -- любая из старых ( до 90-х ) вполне подойдет ( ели это именно книга, а не брошурка страниц на 200 ) -------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
Helicopterr |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 355 Регистрация: 20.8.2005 Где: Stavropol Репутация: 2 Всего: 3 |
При трансляции исходного кода в машинный имена ф-ций заменяются их адресами. ОС руководит указателями на эти адреса. В случае использования спецификатора inline пред вызовом функции указатель не создаётся. И, как уже было сказано, в месте вызова оказывается ее код. Для чего это надо? Если inline ф-ция мала, то будет быстрее работать программа.
-------------------- people can fly |
|||
|
||||
AlexPro |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 157 Регистрация: 9.11.2005 Где: Санкт-Петербург Репутация: 1 Всего: 4 |
Tulsky, а что, собственно, вы хотите найти в книге? В тех книгах, что мне пришлось прочесть, inline-функциям было посвящено не более двух-трех строк. И этой информации, в принципе, достаточно. BreakPointMAN на примере хорошо продемонстрировал суть inline-функций. Единственно, что можно добавить, что inline является лишь рекомендацией компилятору. Если в программе есть очень короткие (скажем 1-5 команд) функции, которые используются очень часто (и особенно в циклах), объявление их inline может дать существенный прирост производительности за счет исключения накладных расходов при вызове функции. Побочный эффект - некоторое увеличение размера программы.
|
|||
|
||||
Tulsky |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 7.12.2005 Репутация: нет Всего: нет |
Мне интересен процесс на уровне машинных команд, т.е. уровне стеков, конвееров и регистров. Помогите, объясните, уж больно надо, иль хоть книгу посоветуёте стоющую. |
|||
|
||||
BreakPointMAN |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 15.9.2004 Где: Saratov Репутация: 14 Всего: 24 |
Tulsky, а ты хотя бы приблизительное представление об этих "стеках, конвеерах и регистрах" имеешь? Что-то мне подсказывает, что не имеешь... Вообще говоря, из моего сообщения от 6.2.2006, 02:19 ты уже мог бы извлечь некоторое кол-во полезной для тебя информации, но, судя по всему, ты хочешь, чтобы тебе все разжевали и поднесли на блюдечке. Не будет такого. Бери книги по ассемблеру, по си, и внимательно, вдумчиво читай.
-------------------- "Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце") |
|||
|
||||
Tulsky |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 7.12.2005 Репутация: нет Всего: нет |
Читаю! Но книжка размером 500 станиц, а информация нужна как можно скорее. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |