Форум программистов, компьютерный форум CyberForum.ru

Описатель inline - C++

Восстановить пароль Регистрация
 
bgm313
12 / 12 / 2
Регистрация: 27.07.2012
Сообщений: 208
17.09.2012, 00:14     Описатель inline #1
Описатель inline должен располагаться только в прототипе или определении функции или и там, и там?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.09.2012, 00:14     Описатель inline
Посмотрите здесь:

inline C++
Inline функции C++
Когда закрывать описатель созданного потока? C++
C++ inline функции vs инструкции inline функций
Класс, inline C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Pure
 Аватар для Pure
228 / 49 / 2
Регистрация: 13.03.2012
Сообщений: 453
Записей в блоге: 7
17.09.2012, 00:26     Описатель inline #2
bgm313, в прототипе. но если есть огромное желание то располагай и там и там
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
17.09.2012, 00:28     Описатель inline #3
Не важно. Вообще он относится к прототипу (function declaration), но определение функции (function definition) включает в себя прототип.
bgm313
12 / 12 / 2
Регистрация: 27.07.2012
Сообщений: 208
17.09.2012, 00:33  [ТС]     Описатель inline #4
Можно ли как-то определить сгенерировал компилятор встроенную функцию или нет?
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
17.09.2012, 00:37     Описатель inline #5
Посмотреть дизассемблерный листинг, работает 100%.

gcc можно сказать -Winline и он скажет, какие функции, которые явно или неявно должны были быть inline, он не смог заинлайнить.

У Студии, судя по этому, есть механизм "Я сказал, делай inline и не жалуйся".
bgm313
12 / 12 / 2
Регистрация: 27.07.2012
Сообщений: 208
17.09.2012, 00:48  [ТС]     Описатель inline #6
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Посмотреть дизассемблерный листинг, работает 100%.
gcc можно сказать -Winline и он скажет, какие функции, которые явно или неявно должны были быть inline, он не смог заинлайнить
А что там в диз.коде должно быть? Как он помечает эти функции?
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
17.09.2012, 00:56     Описатель inline #7
Цитата Сообщение от bgm313 Посмотреть сообщение
А что там в диз.коде должно быть? Как он помечает эти функции?
он встраивает код функции вместо asm'ог call'a


Цитата Сообщение от bgm313 Посмотреть сообщение
Описатель inline должен располагаться только в прототипе или определении функции или и там, и там?
как правило в прототипе, или в отдельном хедере, доступном из хедера прототипа
собственно код inline функции должен быть доступен для встраивания
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
17.09.2012, 00:57     Описатель inline #8
Посмотреть на место вызова заинлайненной функции и проверить, встроился ли там код всей функции, или же есть call на неё. Очевидно же :-)
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
17.09.2012, 01:01     Описатель inline #9
bgm313, никак, в нем просто нет вызова этих функций, код просто встраивается в то место, где используется функция.

Добавлено через 2 минуты
В gcc есть ключ -finline-functions, который входит в флаг оптимизации O3.
bgm313
12 / 12 / 2
Регистрация: 27.07.2012
Сообщений: 208
17.09.2012, 01:08  [ТС]     Описатель inline #10
Цитата Сообщение от Герц Посмотреть сообщение
Посмотреть на место вызова заинлайненной функции и проверить, встроился ли там код всей функции, или же есть call на неё. Очевидно же :-)
Тогда получается, что у меня студия совсем не генерирует встроенный код?
Вот листинг:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
using namespace std;
 
inline int f0(int r) {return 1;}
int f1(int);
 
inline int f2(int);
 
__forceinline int f3(int);
 
int main(){
    f0(2);
    f1(2);
    f2(3);
    f3(5);
 
    return 0;
}
 
 
 
int f1(int a){ return a + 1; }
 
int f2(int a){ return a + 2; }
 
int f3(int a){ return a + 3; }

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
int main(){
004113A0  push        ebp  
004113A1  mov         ebp,esp  
004113A3  sub         esp,0C0h  
004113A9  push        ebx  
004113AA  push        esi  
004113AB  push        edi  
004113AC  lea         edi,[ebp-0C0h]  
004113B2  mov         ecx,30h  
004113B7  mov         eax,0CCCCCCCCh  
004113BC  rep stos    dword ptr es:[edi]  
    f0(2);
004113BE  push        2  
004113C0  call        f0 (4111CCh)  
004113C5  add         esp,4  
    f1(2);
004113C8  push        2  
004113CA  call        f1 (41108Ch)  
004113CF  add         esp,4  
    f2(3);
004113D2  push        3  
004113D4  call        f2 (41109Bh)  
004113D9  add         esp,4  
    f3(5);
004113DC  push        5  
004113DE  call        f3 (411096h)  
004113E3  add         esp,4  
 
    return 0;
004113E6  xor         eax,eax  
}
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
17.09.2012, 01:11     Описатель inline #11
Цитата Сообщение от bgm313 Посмотреть сообщение
Тогда получается, что у меня студия совсем не генерирует встроенный код?
оптимизация включена? (яуж не помню как это варьируется в студии)
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
17.09.2012, 01:12     Описатель inline #12
А у вас галочка включена? По умолчанию она не инлайнит вообще, даже то, что помечено. Или ключ /Ob1 (инлайнить при возможности только то, что помечено), или любой из оптимизационных (/O1, /O2, /Ox; они включают /Ob2 = инлайнить всё, что можно, даже если не помечено)
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
17.09.2012, 01:21     Описатель inline #13
поудалял все
bgm313
12 / 12 / 2
Регистрация: 27.07.2012
Сообщений: 208
18.09.2012, 20:59  [ТС]     Описатель inline #14
Во вкладке оптимизация, я нашёл где поставить галочку и изменил её.

Была:
Развёртывание подставляемых функции: по умолчанию
Сделал:Развёртывание подставляемых функции: Только __inline (/ob1)

Попытался скомпилировать код, выскочила ошибка:

error D8016: несовместимые параметры командной строки "/ZI" и "/Ob1"C:\...

Что такое параметр /Zi? С чем он связан? Как устранить error?
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
18.09.2012, 21:15     Описатель inline #15
/ZI = отладочная информация, позволяющая докомпилировать редактируемый в отладчике код на лету.

Выбираете что-то одно: или инлайн, или это. Искать где-то в соответствующей вкладке.
bgm313
12 / 12 / 2
Регистрация: 27.07.2012
Сообщений: 208
18.09.2012, 21:24  [ТС]     Описатель inline #16
1.
Я нашёл где этот параметр. Он стоит по умолчанию, если меняю его то код вроде работает:
Вот список доступных вариантов:

-c7 совместимо(/z7)
-База данных программы (/Zi)
-База данных программы для операции "Изменить и продолжить" (/ZI)

Какой из вариантов наиболее оптимальный при использование inline функций?

2.Скомпилировал код с inline функциями. В диз. коде никаких call нет. Но и код функции туда не вставляется. Там почему-то просто пишется имя функции. Так и должно быть?
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
18.09.2012, 21:32     Описатель inline #17
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Какой из вариантов наиболее оптимальный при использование inline функций?
Никакой для release-версии, /ZI для отладки. (Или /Zi, там у /ZI есть немного противопоказаний.) Приобретение в скорости не важно при отладке, оно важно в релизной версии. А если код ломается, если что-то не инлайнить, то это плохо.

Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
2.Скомпилировал код с inline функциями. В диз. коде никаких call нет. Но и код функции туда не вставляется. Там почему-то просто пишется имя функции. Так и должно быть?
Не знаю, может то дизассемблер студии помечает так место "сюда подставлен код такой-то функции".
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
18.09.2012, 21:35     Описатель inline #18
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
может то дизассемблер
Скорей наоборот. Потому что, как мне всегда казалось, сначала создается код на asm, который потом компилируется в машинный.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.09.2012, 21:39     Описатель inline
Еще ссылки по теме:

inline функции C++
#define VS inline C++
C++ Inline функции - на сколько должна быть маленькая функция, чтоб она подошла под inline?

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
18.09.2012, 21:39     Описатель inline #19
Да нет, всё вам верно кажется. Просто я так обозвал эту штуку, которая показывает ассемблерный код вперемешку с соответствующими ему строками исходника.
Yandex
Объявления
18.09.2012, 21:39     Описатель inline
Ответ Создать тему
Опции темы

Текущее время: 04:52. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru