Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
bgm313
12 / 12 / 3
Регистрация: 27.07.2012
Сообщений: 208
1

Описатель inline

17.09.2012, 00:14. Просмотров 800. Ответов 18
Метки нет (Все метки)

Описатель inline должен располагаться только в прототипе или определении функции или и там, и там?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.09.2012, 00:14
Ответы с готовыми решениями:

Inline функции - на сколько должна быть маленькая функция, чтоб она подошла под inline?
Здравствуйте. Знаю теорию, но не понимаю, на сколько должна быть маленькая...

inline функции vs инструкции inline функций
Здравствуйте. Чтобы не писать повторно код, нужно использовать функции. Но если...

Когда закрывать описатель созданного потока?
Можно ли после создания потока сразу же закрывать его описатель: HANDLE...

inline
В хедере определён класс со static-методами, в исходнике реализация этих...

inline и define
Почему использовать inline-функции лучше, чем использовать команду...

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

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

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


Цитата Сообщение от bgm313 Посмотреть сообщение
Описатель inline должен располагаться только в прототипе или определении функции или и там, и там?
как правило в прототипе, или в отдельном хедере, доступном из хедера прототипа
собственно код inline функции должен быть доступен для встраивания
0
Герц
526 / 343 / 12
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
17.09.2012, 00:57 8
Посмотреть на место вызова заинлайненной функции и проверить, встроился ли там код всей функции, или же есть call на неё. Очевидно же :-)
0
Toshkarik
1150 / 867 / 90
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
17.09.2012, 01:01 9
bgm313, никак, в нем просто нет вызова этих функций, код просто встраивается в то место, где используется функция.

Добавлено через 2 минуты
В gcc есть ключ -finline-functions, который входит в флаг оптимизации O3.
0
bgm313
12 / 12 / 3
Регистрация: 27.07.2012
Сообщений: 208
17.09.2012, 01:08  [ТС] 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  
}
0
alex_x_x
бжни
2455 / 1661 / 134
Регистрация: 14.05.2009
Сообщений: 7,162
17.09.2012, 01:11 11
Цитата Сообщение от bgm313 Посмотреть сообщение
Тогда получается, что у меня студия совсем не генерирует встроенный код?
оптимизация включена? (яуж не помню как это варьируется в студии)
1
OhMyGodSoLong
~ Эврика! ~
1246 / 995 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
17.09.2012, 01:12 12
А у вас галочка включена? По умолчанию она не инлайнит вообще, даже то, что помечено. Или ключ /Ob1 (инлайнить при возможности только то, что помечено), или любой из оптимизационных (/O1, /O2, /Ox; они включают /Ob2 = инлайнить всё, что можно, даже если не помечено)
1
DU
1487 / 1133 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
17.09.2012, 01:21 13
поудалял все
0
bgm313
12 / 12 / 3
Регистрация: 27.07.2012
Сообщений: 208
18.09.2012, 20:59  [ТС] 14
Во вкладке оптимизация, я нашёл где поставить галочку и изменил её.

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

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

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

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

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

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

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

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

Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
2.Скомпилировал код с inline функциями. В диз. коде никаких call нет. Но и код функции туда не вставляется. Там почему-то просто пишется имя функции. Так и должно быть?
Не знаю, может то дизассемблер студии помечает так место "сюда подставлен код такой-то функции".
0
Toshkarik
1150 / 867 / 90
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
18.09.2012, 21:35 18
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
может то дизассемблер
Скорей наоборот. Потому что, как мне всегда казалось, сначала создается код на asm, который потом компилируется в машинный.
0
OhMyGodSoLong
~ Эврика! ~
1246 / 995 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
18.09.2012, 21:39 19
Да нет, всё вам верно кажется. Просто я так обозвал эту штуку, которая показывает ассемблерный код вперемешку с соответствующими ему строками исходника.
0
18.09.2012, 21:39
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.09.2012, 21:39

inline explicit
Почему ошибка? #include &lt;iostream&gt; class A { int i; public:...

Inline функции.
Здравствуйте. Скажите пожалуйста, объявление функции как inline нужно делать...

Inline-метод
Как можно декларировать inline-метод класса не используя ключевое слово inline??


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru