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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Inline функция в C++, на машинном коде 
:(
    Опции темы
Tulsky
Дата 5.2.2006, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Объясните пожалуйста что происходит с inline функцией на уровне машинных команд.
PM MAIL   Вверх
MAKCim
Дата 5.2.2006, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



я так полагаю, код функции генерируется в месте ее вызова
Код

<команды>
код функции
<команды>



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Partizan
Дата 5.2.2006, 22:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 4
Всего: 67



а? что значит на уровне машинных команд?

inline означает то, что в программе при компиляции вместо вызовов функции будет вставлен её код(скорее всего)...inline говорит компилятору сгенерить код функции в месте её вызова...
то есть если мы inline функцию вызвали 4 раза то в 4 местах вставится код этой функции...
за счёт этого увеличивается размер прогшраммы и её производительность...

но в основном компиляторы игнорируют inline в объявлении функций, за исключением самых малых...


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
BreakPointMAN
Дата 6.2.2006, 02:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 14
Всего: 24



О'кей, рассмотрим на простом примере. C++ Builder 6, Console Application, Release-версия.
Код
#include <conio.h>
#include <stdio.h>

int sum(int x, int y)
   {
    return x+y;
   }

int main(int argc, char* argv[])
   {
    int x,y,z;
    printf("Enter x, y: ");
    scanf("%d,%d", &x, &y);
    printf("sum of %d and %d is %d", x, y, sum(x,y));
    getch();
    return 0;
   }


...и-и-и во что это превратилось:

Функция main:
Код
.text:00401228 ; --------------- S U B R O U T I N E ---------------------------------------
.text:00401228
.text:00401228 ; Attributes: bp-based frame
.text:00401228
.text:00401228 ; int __cdecl main(int argc,const char **argv,const char *envp)
.text:00401228 _main           proc near               ; DATA XREF: .data:0040E04Co
.text:00401228
.text:00401228 var_8           = dword ptr -8
.text:00401228 var_4           = dword ptr -4
.text:00401228 argc            = dword ptr  8
.text:00401228 argv            = dword ptr  0Ch
.text:00401228 envp            = dword ptr  10h
.text:00401228
.text:00401228                 push    ebp
.text:00401229                 mov     ebp, esp
.text:0040122B                 add     esp, 0FFFFFFF8h
.text:0040122E                 push    offset format   ; "Enter x, y: "
.text:00401233                 call    _printf
.text:00401238                 pop     ecx
.text:00401239                 lea     eax, [ebp+var_8]
.text:0040123C                 push    eax
.text:0040123D                 lea     edx, [ebp+var_4]
.text:00401240                 push    edx
.text:00401241                 push    offset aDD      ; "%d,%d"
.text:00401246                 call    _scanf
.text:0040124B                 add     esp, 0Ch
.text:0040124E                 mov     ecx, [ebp+var_8]
.text:00401251                 push    ecx
.text:00401252                 mov     eax, [ebp+var_4]
.text:00401255                 push    eax
.text:00401256                 call    sub_40121C
.text:0040125B                 add     esp, 8
.text:0040125E                 push    eax
.text:0040125F                 mov     edx, [ebp+var_8]
.text:00401262                 push    edx
.text:00401263                 mov     ecx, [ebp+var_4]
.text:00401266                 push    ecx
.text:00401267                 push    offset aSumOfDAndDIsD ; "sum of %d and %d is %d"
.text:0040126C                 call    _printf
.text:00401271                 add     esp, 10h
.text:00401274                 call    _getch
.text:00401279                 xor     eax, eax
.text:0040127B                 pop     ecx
.text:0040127C                 pop     ecx
.text:0040127D                 pop     ebp
.text:0040127E                 retn
.text:0040127E _main           endp
.text:0040127E
.text:0040127E ; ---------------------------------------------------------------------------


Функция sum:
Код
.text:0040121C ; --------------- S U B R O U T I N E ---------------------------------------
.text:0040121C
.text:0040121C ; Attributes: bp-based frame
.text:0040121C
.text:0040121C sub_40121C      proc near               ; CODE XREF: _main+2Ep
.text:0040121C
.text:0040121C arg_0           = dword ptr  8
.text:0040121C arg_4           = dword ptr  0Ch
.text:0040121C
.text:0040121C                 push    ebp
.text:0040121D                 mov     ebp, esp
.text:0040121F                 mov     eax, [ebp+arg_0]
.text:00401222                 add     eax, [ebp+arg_4]
.text:00401225                 pop     ebp
.text:00401226                 retn
.text:00401226 sub_40121C      endp
.text:00401226
.text:00401226 ; ---------------------------------------------------------------------------


Если бы функция sum была inline, то мы получили бы следующее:
Код
.text:0040121C ; --------------- S U B R O U T I N E ---------------------------------------
.text:0040121C
.text:0040121C ; Attributes: bp-based frame
.text:0040121C
.text:0040121C ; int __cdecl main(int argc,const char **argv,const char *envp)
.text:0040121C _main           proc near               ; DATA XREF: .data:0040E04Co
.text:0040121C
.text:0040121C var_8           = dword ptr -8
.text:0040121C var_4           = dword ptr -4
.text:0040121C argc            = dword ptr  8
.text:0040121C argv            = dword ptr  0Ch
.text:0040121C envp            = dword ptr  10h
.text:0040121C
.text:0040121C                 push    ebp
.text:0040121D                 mov     ebp, esp
.text:0040121F                 add     esp, 0FFFFFFF8h
.text:00401222                 push    offset format   ; "Enter x, y: "
.text:00401227                 call    _printf
.text:0040122C                 pop     ecx
.text:0040122D                 lea     eax, [ebp+var_8]
.text:00401230                 push    eax
.text:00401231                 lea     edx, [ebp+var_4]
.text:00401234                 push    edx
.text:00401235                 push    offset aDD      ; "%d,%d"
.text:0040123A                 call    _scanf
.text:0040123F                 add     esp, 0Ch
.text:00401242                 mov     ecx, [ebp+var_4]
.text:00401245                 add     ecx, [ebp+var_8]
.text:00401248                 push    ecx
.text:00401249                 mov     eax, [ebp+var_8]
.text:0040124C                 push    eax
.text:0040124D                 mov     edx, [ebp+var_4]
.text:00401250                 push    edx
.text:00401251                 push    offset aSumOfDAndDIsD ; "sum of %d and %d is %d"
.text:00401256                 call    _printf
.text:0040125B                 add     esp, 10h
.text:0040125E                 call    _getch
.text:00401263                 xor     eax, eax
.text:00401265                 pop     ecx
.text:00401266                 pop     ecx
.text:00401267                 pop     ebp
.text:00401268                 retn
.text:00401268 _main           endp
.text:00401268
.text:00401268 ; ---------------------------------------------------------------------------


Как видно, во втором случае sum не оформлена в виде отдельной функции, а "встроена" в main... smile


--------------------
"Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце")
PM WWW ICQ   Вверх
Fin
Дата 6.2.2006, 03:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дракон->Спать();
**


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

Репутация: 3
Всего: 10



Стоить добавить только, что inline функции компилятор отрабатывает только в релиз режиме. В Дебаг режиме, он игнорирует слово inline.


--------------------
Пролетал мимо.
PM MAIL   Вверх
Tulsky
Дата 6.2.2006, 06:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А книжку про все эти дела некто не подскажет?
PM MAIL   Вверх
_hunter
Дата 6.2.2006, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 16
Всего: 98



любая книжка по асму ( не справочник )
потом любая старая книжка по С ( не С++ )


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
BreakPointMAN
Дата 6.2.2006, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 14
Всего: 24



"Фундаментальные основы хакерства. Искусство дизассемблирования." © Крис Касперски - в книге есть раздел "Идентификация встраиваемых (inline) функций". Но не думаю, что тебе это много даст. Еще можешь на форум http://wasm.ru/forum заглянуть. Кажется, я там недавно видел вопрос по автоматическому поиску inline-функций в коде, может для себя что полезное найдешь...

Это сообщение отредактировал(а) BreakPointMAN - 6.2.2006, 11:59


--------------------
"Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце")
PM WWW ICQ   Вверх
Tulsky
Дата 7.2.2006, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

любая книжка по асму ( не справочник )
потом любая старая книжка по С ( не С++ )


Не уверен, что в C был inline, но всё же какую книгу по окнкретней вы можете посоветовать?
PM MAIL   Вверх
_hunter
Дата 7.2.2006, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 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...
PM ICQ   Вверх
Helicopterr
Дата 7.2.2006, 23:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



При трансляции исходного кода в машинный имена ф-ций заменяются их адресами. ОС руководит указателями на эти адреса. В случае использования спецификатора inline пред вызовом функции указатель не создаётся. И, как уже было сказано, в месте вызова оказывается ее код. Для чего это надо? Если inline ф-ция мала, то будет быстрее работать программа.


--------------------
people can fly
PM MAIL   Вверх
AlexPro
Дата 8.2.2006, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

Репутация: 1
Всего: 4



Tulsky, а что, собственно, вы хотите найти в книге? В тех книгах, что мне пришлось прочесть, inline-функциям было посвящено не более двух-трех строк. И этой информации, в принципе, достаточно. BreakPointMAN на примере хорошо продемонстрировал суть inline-функций. Единственно, что можно добавить, что inline является лишь рекомендацией компилятору. Если в программе есть очень короткие (скажем 1-5 команд) функции, которые используются очень часто (и особенно в циклах), объявление их inline может дать существенный прирост производительности за счет исключения накладных расходов при вызове функции. Побочный эффект - некоторое увеличение размера программы.
PM MAIL   Вверх
Tulsky
Дата 8.2.2006, 21:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

Tulsky, а что, собственно, вы хотите найти в книге?

Мне интересен процесс на уровне машинных команд, т.е. уровне стеков, конвееров и регистров.
Помогите, объясните, уж больно надо, иль хоть книгу посоветуёте стоющую.
PM MAIL   Вверх
BreakPointMAN
Дата 8.2.2006, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 14
Всего: 24



Tulsky, а ты хотя бы приблизительное представление об этих "стеках, конвеерах и регистрах" имеешь? Что-то мне подсказывает, что не имеешь... Вообще говоря, из моего сообщения от 6.2.2006, 02:19 ты уже мог бы извлечь некоторое кол-во полезной для тебя информации, но, судя по всему, ты хочешь, чтобы тебе все разжевали и поднесли на блюдечке. Не будет такого. Бери книги по ассемблеру, по си, и внимательно, вдумчиво читай.


--------------------
"Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце")
PM WWW ICQ   Вверх
Tulsky
Дата 9.2.2006, 09:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

Бери книги по ассемблеру, по си, и внимательно, вдумчиво читай.

Читаю! Но книжка размером 500 станиц, а информация нужна как можно скорее.
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.0892 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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