Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
12 / 12 / 3
Регистрация: 27.07.2012
Сообщений: 208

Описатель inline

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

Студворк — интернет-сервис помощи студентам
Описатель inline должен располагаться только в прототипе или определении функции или и там, и там?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.09.2012, 00:14
Ответы с готовыми решениями:

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

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

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

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

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

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


Цитата Сообщение от bgm313 Посмотреть сообщение
Описатель inline должен располагаться только в прототипе или определении функции или и там, и там?
как правило в прототипе, или в отдельном хедере, доступном из хедера прототипа
собственно код inline функции должен быть доступен для встраивания
0
545 / 344 / 12
Регистрация: 05.11.2010
Сообщений: 1,076
Записей в блоге: 1
17.09.2012, 00:57
Посмотреть на место вызова заинлайненной функции и проверить, встроился ли там код всей функции, или же есть call на неё. Очевидно же :-)
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
17.09.2012, 01:01
bgm313, никак, в нем просто нет вызова этих функций, код просто встраивается в то место, где используется функция.

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

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

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

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

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

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

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

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

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

Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
2.Скомпилировал код с inline функциями. В диз. коде никаких call нет. Но и код функции туда не вставляется. Там почему-то просто пишется имя функции. Так и должно быть?
Не знаю, может то дизассемблер студии помечает так место "сюда подставлен код такой-то функции".
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
18.09.2012, 21:35
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
может то дизассемблер
Скорей наоборот. Потому что, как мне всегда казалось, сначала создается код на asm, который потом компилируется в машинный.
0
~ Эврика! ~
 Аватар для OhMyGodSoLong
1258 / 1007 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
18.09.2012, 21:39
Да нет, всё вам верно кажется. Просто я так обозвал эту штуку, которая показывает ассемблерный код вперемешку с соответствующими ему строками исходника.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.09.2012, 21:39
Помогаю со студенческими работами здесь

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

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

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

inline и define
Почему использовать inline-функции лучше, чем использовать команду препроцессора #define? Смысл в том, что лучше лишний раз не трогать...

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


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru