Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.62/26: Рейтинг темы: голосов - 26, средняя оценка - 4.62
74 / 37 / 3
Регистрация: 23.09.2012
Сообщений: 408

#define VS inline

15.01.2013, 16:35. Показов 5920. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Что работает быстрее:

C++
1
2
3
4
5
6
7
8
9
#define SQR(x) x*x
 
void Func()
{
for(int i = 0; i < 10; ++i)
{
cout << SQR(i) << endl;
}
}
или

C++
1
2
3
4
5
6
7
8
9
inline int sqr(int x){ return x*x; }
 
void Func()
{
for(int i = 0; i < 10; ++i)
{
cout << sqr(i) << endl;
}
}

Или же в каких ситуациях быстрее то или иное?
Компилятор: VS2012
Настройки оптимизации: максимальная скорость

Мое предположение - дефайн быстрее инлайна, потому что последний - это вызов функции. Даже не смотря на то, что быстрый вызов функции.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.01.2013, 16:35
Ответы с готовыми решениями:

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

Как влияет inline и обертка(#ifndef #define #endif) .h файла на компоновщик.
Есть файл Point.h: #ifndef POINT_GUARD #define POINT_GUARD ...

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

22
15.01.2013, 16:46

Не по теме:

Цитата Сообщение от Kgfq Посмотреть сообщение
потому что последний - это вызов функции
Последний - это совет компилятору встроить функцию в то место, откуда её вызывают.



Не по теме:

Цитата Сообщение от Kgfq Посмотреть сообщение
C++
1
#define SQR(x) x*x
Это вообще работать не будет как надо.

0
74 / 37 / 3
Регистрация: 23.09.2012
Сообщений: 408
15.01.2013, 16:58  [ТС]
Croessmah, в данном случае - будет. Я спрашиваю про данный случай

Добавлено через 25 секунд
И да, про ошибки вида: 2+3*2+3 я знаю. Сейчас скобки не ставил сознательно
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
15.01.2013, 16:58
У меня в данном коде быстрее работает inline функция
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
#include <iostream>
#include <ctime>
 
#define sqr(x) (x)*(x)
 
inline int foo(int x){return x*x;}
 
int main(){
    time_t start,finish;
    int n,f;
    std::cin>>n>>f;
    start=clock();
    for(int i=0;i<f+100000000;++i){
        n=sqr(i);
    }
    finish=clock();
    std::cout<<finish-start<<std::endl;
    start=clock();
    for(int i=0;i<f+100000000;++i){
        n=foo(i);
    }
    finish=clock();
    std::cout<<finish-start<<std::endl;
    return 0;
}
0
74 / 37 / 3
Регистрация: 23.09.2012
Сообщений: 408
15.01.2013, 17:11  [ТС]
Croessmah,
1) зачем cin >> n?
2) у меня def работал 0.289, а inline - 3.029
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
15.01.2013, 17:14
Цитата Сообщение от Kgfq Посмотреть сообщение
2) у меня def работал 0.289, а inline - 3.029
Release конфигурация?
Цитата Сообщение от Kgfq Посмотреть сообщение
1) зачем cin >> n?
а иначе оптимизатор все это убьет, сказав, что это не нужно.
0
 Аватар для FreeMinder
36 / 36 / 4
Регистрация: 29.08.2012
Сообщений: 59
15.01.2013, 17:18
Я считаю лучше поставить вопрос не что быстрее, а что корректней.
Например:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
 
#define sqr(x) (x)*(x)
 
int foo(int x){return x*x;}
 
int main()
{
    int x = 2 , y = 3;
        std::cout<<sqr(++x)<<std::endl;
    std::cout<<foo(++y)<<std::endl;
    return 0;
}
0
Higher
 Аватар для diagon
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
15.01.2013, 17:22
Цитата Сообщение от Kgfq Посмотреть сообщение
Даже не смотря на то, что быстрый вызов функции.
Чего? Инлайн - это когда компилятор подставляет функцию в код.
Т.е. вместо SQR(i) он подставляет i * i. Так что разницы в данном случае вообще нету.
Причем нормальный компилятор в любом случае будет инлайнить функции(если это выгодно), даже если они не помечены как inline. Поэтому ключевое слово inline в общем-то бесполезно.

Вывод: всегда используйте функции вместо макросов, если есть такая возможность.
0
 Аватар для FreeMinder
36 / 36 / 4
Регистрация: 29.08.2012
Сообщений: 59
15.01.2013, 17:22
Цитата Сообщение от Kgfq Посмотреть сообщение
Мое предположение - дефайн быстрее инлайна, потому что последний - это вызов функции.
inline-функция — это такая функция, чье тело подставляется в каждую точ*ку вызова, вместо того, чтобы генерировать код вызова. Это подобно использованию параметризованных макросов в С. Причина использования inline-функции заключается в их эффективности. Всякий раз, когда вы*зывается функция, необходимо выполнить серию инструкций для формирования вызова функции, вставки аргументов в стек и возврата значения из функции. ( взято отсюда )
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
15.01.2013, 17:24
Цитата Сообщение от FreeMinder Посмотреть сообщение
inline-функция — это такая функция, чье тело подставляется в каждую точ*ку вызова, вместо того, чтобы генерировать код вызова.
чье тело может подставиться в функцию. Подставлять функцию или нет - решает компилятор.
0
840 / 347 / 67
Регистрация: 20.11.2012
Сообщений: 810
15.01.2013, 17:27
Assembler
1
2
3
4
5
6
7
8
9
10
$LL15@main:
 
; 14   :        n=sqr(i);
 
    mov eax, ecx
    imul    eax, ecx
    inc ecx
    mov DWORD PTR _n$[esp+24], eax
    cmp ecx, esi
    jl  SHORT $LL15@main
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$LL17@main:
 
; 6    : int foo(int x){return x*x;}
 
    mov eax, ecx
    imul    eax, ecx
 
; 19   :    for(int i=0;i<f+100000000;++i){
 
    inc ecx
 
; 20   :        n=foo(i);
 
    mov DWORD PTR _n$[esp+24], eax
    cmp ecx, esi
    jl  SHORT $LL17@main
Разницы - 0. VS2012, оптимизация по скорости.
Нужно прогнать результаты несколько раз, чтобы получить корректные данные (кэш etc).
Миниатюры
#define VS inline  
0
74 / 37 / 3
Регистрация: 23.09.2012
Сообщений: 408
15.01.2013, 17:29  [ТС]
Croessmah, в релиз версии inline был быстрее. Хм. Тогда встает вопрос - за счет чего. Ведь даже есть подставить, то это одно и то же
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
15.01.2013, 18:07
Инлайн-функции и макросы
0
74 / 37 / 3
Регистрация: 23.09.2012
Сообщений: 408
15.01.2013, 18:50  [ТС]
Croessmah, это все - лишь трудности работы с ними. Меня же интересует только скорость. Что быстрее и почему
0
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
15.01.2013, 21:13
Цитата Сообщение от WhiteP Посмотреть сообщение
Нужно прогнать результаты несколько раз, чтобы получить корректные данные (кэш etc).
Если ассемблерный код получился идентичный, то разница может быть только в зависимости от того, сколько выделено процессорного времение этому процессу относительно пользовательского времени. Т.е. в момент замера времени цикла с макросом это может быть одно время, а во время замера цикла с инлайн функцией это может быть другое время. Кэш тут не повлияет (т.е. как я понял имелись ввиду кэш-миссы), т.к. результат кладется в одну и ту же ячейку памяти, которая после первого обращения к ней так и будет лежать в кэше.
Цитата Сообщение от Kgfq Посмотреть сообщение
Меня же интересует только скорость. Что быстрее и почему
Привиденный выше ассембреный код показывает, что скорость будет одинакова (прим. см. выше).

Добавлено через 1 минуту
фунция clock() как раз возвращает пользовательское время, т.е. замеры не валидны.
1
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
15.01.2013, 21:42
Цитата Сообщение от Kgfq Посмотреть сообщение
Что работает быстрее
Если компилятор работает с оптимизациями (для тех, кто пользуется IDE это означает сборку Release), коды будут работать с одинаковой скоростью. Думаю, что даже итоговый двоичный код получится одинаковый

Добавлено через 2 минуты
Цитата Сообщение от Kgfq Посмотреть сообщение
Что быстрее и почему
Почему. В случае с препроцессированием на этап трансляции попадает уже подставленный код. В случае с инлайном при подстановке инлайн-функции и дальнейших оптимизаций на этапе трансляции входной код преобразуется в то же самое, что получаем на выходе в первом случае
0
840 / 347 / 67
Регистрация: 20.11.2012
Сообщений: 810
15.01.2013, 23:41
Цитата Сообщение от Kastaneda Посмотреть сообщение
Если ассемблерный код получился идентичный, то разница может быть только в зависимости от того, сколько выделено процессорного времение этому процессу относительно пользовательского времени. Т.е. в момент замера времени цикла с макросом это может быть одно время, а во время замера цикла с инлайн функцией это может быть другое время. Кэш тут не повлияет (т.е. как я понял имелись ввиду кэш-миссы), т.к. результат кладется в одну и ту же ячейку памяти, которая после первого обращения к ней так и будет лежать в кэше.
Да, про кэш - это я так, не подумав.
Не совсем понял про процессорное время. Имеешь в виду квант времени, выделенный потоку? Но тогда разброс был бы сильнее...
Скопировал функции по очереди несколько раз. Написал свою clock-функцию, которая меряет с помощью rdtsc. Запустил программу несколько раз - все время результат такой, что время работы цикла в первый раз всегда больше чем последующие. Все остальные кроме первого почти одинаковые. Пока не могу сообразить от чего так...

235658477
154597694
154608102
154589083
154586363
154684490
154605230
154617741
154716524
154608589
154621387
154627704
154653977
154595190
154607777
154592597
154588155
154601891
154608092
153413523
154646412
154609868
154599756
154606503
154595169
157064581
154599518
154682194
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
16.01.2013, 00:53
Цитата Сообщение от Croessmah Посмотреть сообщение
Последний - это совет компилятору встроить функцию в то место, откуда её вызывают.
Вы правы, стоит использовать __forceinline



Цитата Сообщение от diagon Посмотреть сообщение
Вывод: всегда используйте функции вместо макросов, если есть такая возможность.
Вот именно. Смысл в С++ от таких макросов никакого. Только вот, мне не понятно, с каким уровнем оптимизации вы все компилируете.

Вообще лучше инлайнить все, что можно. Но бывают случаи когда без инлайна все работает гораздо быстрей
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
16.01.2013, 00:57
#define - элемент языка С, в С++ желательно использовать его исключать, для этого есть все средства.
inline - это просьба компилятору, по-факту, он итак сам расставляет inline.
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
16.01.2013, 01:05
Цитата Сообщение от MrGluck Посмотреть сообщение
#define - элемент языка С, в С++ желательно использовать его исключать, для этого есть все средства.
Не согласен.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.01.2013, 01:05
Помогаю со студенческими работами здесь

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

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

#define
ребята, подскажите, вернее пролейте свет, на то , как это работает... #include &lt;iostream&gt; #define str(x) #x using namespace...

define не
Здравствуйте. &quot;Дефайню&quot; &quot;%f&quot; для вывода: #define fss &quot;%f&quot;; . И потом делаю вывод вот такой вот: for(i=0;i&lt;n;i++)...

C++define
Люди добрые , помогите советом ! Фрагмент с кодом самого метода : #include &lt;iostream&gt; // для std :: cout #include...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
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. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru