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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.64
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
#1

#define VS inline - C++

15.01.2013, 16:35. Просмотров 1834. Ответов 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
Настройки оптимизации: максимальная скорость

Мое предположение - дефайн быстрее инлайна, потому что последний - это вызов функции. Даже не смотря на то, что быстрый вызов функции.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.01.2013, 16:35     #define VS inline
Посмотрите здесь:

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

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

define - C++
Всем здрасьте , что означает эта строчка? #define MAX(a,b) a&gt;b? a:b

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

#define c :: - C++
Подскажите как реализовать такую замену: #define sa2::sys::getClientKernel()-&gt;getXDBTManager() cls_SimpleXDBTManager::Instance() ...

#define - C++
#define зачем нужна это заголовочный файл какие у него функции и как им ползоватса?

c++11 и $define - C++
Есть код который прекрасно компилируется без -std=c++11, но как только я включаю эту опцию то константы препроцессора не заменяются и...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
15.01.2013, 16:46
  #2

Не по теме:

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



Не по теме:

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

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

Добавлено через 25 секунд
И да, про ошибки вида: 2+3*2+3 я знаю. Сейчас скобки не ставил сознательно
Croessmah
Модератор
Эксперт CЭксперт С++
13052 / 7315 / 814
Регистрация: 27.09.2012
Сообщений: 18,052
Записей в блоге: 3
Завершенные тесты: 1
15.01.2013, 16:58     #define VS inline #4
У меня в данном коде быстрее работает 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;
}
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
15.01.2013, 17:11  [ТС]     #define VS inline #5
Croessmah,
1) зачем cin >> n?
2) у меня def работал 0.289, а inline - 3.029
Croessmah
Модератор
Эксперт CЭксперт С++
13052 / 7315 / 814
Регистрация: 27.09.2012
Сообщений: 18,052
Записей в блоге: 3
Завершенные тесты: 1
15.01.2013, 17:14     #define VS inline #6
Цитата Сообщение от Kgfq Посмотреть сообщение
2) у меня def работал 0.289, а inline - 3.029
Release конфигурация?
Цитата Сообщение от Kgfq Посмотреть сообщение
1) зачем cin >> n?
а иначе оптимизатор все это убьет, сказав, что это не нужно.
FreeMinder
36 / 36 / 2
Регистрация: 29.08.2012
Сообщений: 59
15.01.2013, 17:18     #define VS inline #7
Я считаю лучше поставить вопрос не что быстрее, а что корректней.
Например:
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;
}
diagon
Higher
1928 / 1194 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
15.01.2013, 17:22     #define VS inline #8
Цитата Сообщение от Kgfq Посмотреть сообщение
Даже не смотря на то, что быстрый вызов функции.
Чего? Инлайн - это когда компилятор подставляет функцию в код.
Т.е. вместо SQR(i) он подставляет i * i. Так что разницы в данном случае вообще нету.
Причем нормальный компилятор в любом случае будет инлайнить функции(если это выгодно), даже если они не помечены как inline. Поэтому ключевое слово inline в общем-то бесполезно.

Вывод: всегда используйте функции вместо макросов, если есть такая возможность.
FreeMinder
36 / 36 / 2
Регистрация: 29.08.2012
Сообщений: 59
15.01.2013, 17:22     #define VS inline #9
Цитата Сообщение от Kgfq Посмотреть сообщение
Мое предположение - дефайн быстрее инлайна, потому что последний - это вызов функции.
inline-функция — это такая функция, чье тело подставляется в каждую точ*ку вызова, вместо того, чтобы генерировать код вызова. Это подобно использованию параметризованных макросов в С. Причина использования inline-функции заключается в их эффективности. Всякий раз, когда вы*зывается функция, необходимо выполнить серию инструкций для формирования вызова функции, вставки аргументов в стек и возврата значения из функции. ( взято отсюда )
Croessmah
Модератор
Эксперт CЭксперт С++
13052 / 7315 / 814
Регистрация: 27.09.2012
Сообщений: 18,052
Записей в блоге: 3
Завершенные тесты: 1
15.01.2013, 17:24     #define VS inline #10
Цитата Сообщение от FreeMinder Посмотреть сообщение
inline-функция — это такая функция, чье тело подставляется в каждую точ*ку вызова, вместо того, чтобы генерировать код вызова.
чье тело может подставиться в функцию. Подставлять функцию или нет - решает компилятор.
WhiteP
606 / 204 / 23
Регистрация: 20.11.2012
Сообщений: 426
15.01.2013, 17:27     #define VS inline #11
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  
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
15.01.2013, 17:29  [ТС]     #define VS inline #12
Croessmah, в релиз версии inline был быстрее. Хм. Тогда встает вопрос - за счет чего. Ведь даже есть подставить, то это одно и то же
Croessmah
Модератор
Эксперт CЭксперт С++
13052 / 7315 / 814
Регистрация: 27.09.2012
Сообщений: 18,052
Записей в блоге: 3
Завершенные тесты: 1
15.01.2013, 18:07     #define VS inline #13
Инлайн-функции и макросы
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
15.01.2013, 18:50  [ТС]     #define VS inline #14
Croessmah, это все - лишь трудности работы с ними. Меня же интересует только скорость. Что быстрее и почему
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.01.2013, 21:13     #define VS inline
Еще ссылки по теме:

#define - C++
Здравствуйте, дорогие программисты! сразу хочу сказать, что в С++ я совсем недавно, поэтому толком ничего не знаю Во-первых,...

define - C++
И еще такой вопрос для чего служит #define ??

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

Const #define - C++
{ const int HOLFSDsize= 2;//#define HOLFSDsize 2 // m-угольник void HOLFSD() { int i, n, l; // объявляем...

Директивы define - C++
Рассматривая настоящую объемную программу, наткнулся на огромное количество файлов с длинным списком директив #define. Можете вкратце...


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

Или воспользуйтесь поиском по форуму:
Kastaneda
Форумчанин
Эксперт С++
4511 / 2853 / 227
Регистрация: 12.12.2009
Сообщений: 7,249
Записей в блоге: 1
Завершенные тесты: 1
15.01.2013, 21:13     #define VS inline #15
Цитата Сообщение от WhiteP Посмотреть сообщение
Нужно прогнать результаты несколько раз, чтобы получить корректные данные (кэш etc).
Если ассемблерный код получился идентичный, то разница может быть только в зависимости от того, сколько выделено процессорного времение этому процессу относительно пользовательского времени. Т.е. в момент замера времени цикла с макросом это может быть одно время, а во время замера цикла с инлайн функцией это может быть другое время. Кэш тут не повлияет (т.е. как я понял имелись ввиду кэш-миссы), т.к. результат кладется в одну и ту же ячейку памяти, которая после первого обращения к ней так и будет лежать в кэше.
Цитата Сообщение от Kgfq Посмотреть сообщение
Меня же интересует только скорость. Что быстрее и почему
Привиденный выше ассембреный код показывает, что скорость будет одинакова (прим. см. выше).

Добавлено через 1 минуту
фунция clock() как раз возвращает пользовательское время, т.е. замеры не валидны.
Yandex
Объявления
15.01.2013, 21:13     #define VS inline
Ответ Создать тему
Опции темы

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