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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
bgm313
12 / 12 / 2
Регистрация: 27.07.2012
Сообщений: 208
#1

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

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

Описатель inline должен располагаться только в прототипе или определении функции или и там, и там?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.09.2012, 00:14
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Описатель inline (C++):

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

inline функции vs инструкции inline функций - C++
Здравствуйте. Чтобы не писать повторно код, нужно использовать функции. Но если функции компактные, то их лучше делать inline функциями, т....

Когда закрывать описатель созданного потока? - C++
Можно ли после создания потока сразу же закрывать его описатель: HANDLE hThread = (HANDLE)_beginthreadex(...); CloseHandle(hThread);...

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

inline explicit - C++
Почему ошибка? #include <iostream> class A { int i; public: explicit A(int x = 0); void show() {std::cout << "i = "...

inline функция - C++
Помогите плиз, трудности с функцией inline. Внешняя функция exam заносит в объект класса Stud результаты сессии. \\ вот часть задания по...

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

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

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


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

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

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

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

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

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

Выбираете что-то одно: или инлайн, или это. Искать где-то в соответствующей вкладке.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.09.2012, 21:15
Привет! Вот еще темы с ответами:

inline функции - C++
Объясните, пожалуйста, почему со всеми inline программа не работает, а если их закомментировать - работает. // main.cpp #include...

Класс, inline - C++
Все ли функции класса по умолчанию содержат спецификатор inline? Нужно ли его писать перед функциями класса?

Inline функции - C++
Друзья!Инлайн функции могу быть определены только внтури класса?Или могут быть определены вне класса?Если вне,то как?Спасибо!

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
18.09.2012, 21:15
Ответ Создать тему
Опции темы

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