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

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

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

#define VS inline - C++

15.01.2013, 16:35. Просмотров 1835. Ответов 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, но как только я включаю эту опцию то константы препроцессора не заменяются и...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Evg
Эксперт CАвтор FAQ
17543 / 5781 / 370
Регистрация: 30.03.2009
Сообщений: 15,923
Записей в блоге: 26
15.01.2013, 21:42     #define VS inline #16
Цитата Сообщение от Kgfq Посмотреть сообщение
Что работает быстрее
Если компилятор работает с оптимизациями (для тех, кто пользуется IDE это означает сборку Release), коды будут работать с одинаковой скоростью. Думаю, что даже итоговый двоичный код получится одинаковый

Добавлено через 2 минуты
Цитата Сообщение от Kgfq Посмотреть сообщение
Что быстрее и почему
Почему. В случае с препроцессированием на этап трансляции попадает уже подставленный код. В случае с инлайном при подстановке инлайн-функции и дальнейших оптимизаций на этапе трансляции входной код преобразуется в то же самое, что получаем на выходе в первом случае
WhiteP
606 / 204 / 23
Регистрация: 20.11.2012
Сообщений: 426
15.01.2013, 23:41     #define VS inline #17
Цитата Сообщение от 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
go
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
16.01.2013, 00:53     #define VS inline #18
Цитата Сообщение от Croessmah Посмотреть сообщение
Последний - это совет компилятору встроить функцию в то место, откуда её вызывают.
Вы правы, стоит использовать __forceinline



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

Вообще лучше инлайнить все, что можно. Но бывают случаи когда без инлайна все работает гораздо быстрей
MrGluck
Модератор
Эксперт CЭксперт С++
7173 / 4339 / 633
Регистрация: 29.11.2010
Сообщений: 11,791
16.01.2013, 00:57     #define VS inline #19
#define - элемент языка С, в С++ желательно использовать его исключать, для этого есть все средства.
inline - это просьба компилятору, по-факту, он итак сам расставляет inline.
go
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
16.01.2013, 01:05     #define VS inline #20
Цитата Сообщение от MrGluck Посмотреть сообщение
#define - элемент языка С, в С++ желательно использовать его исключать, для этого есть все средства.
Не согласен.
MrGluck
Модератор
Эксперт CЭксперт С++
7173 / 4339 / 633
Регистрация: 29.11.2010
Сообщений: 11,791
16.01.2013, 01:16     #define VS inline #21
go, "Компилятор предпочтительнее препроцессора".
У Скотта Мейерса в книге "Эффективное использование С++. 50 рекомендаций по улучшению ваших программ и проектов" подробно описано в "Правило 1. Предпочитайте const и inline использованию #define" (Москва, 2000г, стр. 26). Подобный текст я встречал и ранее у других авторитетных авторов, но их имена не припомню.

Добавлено через 2 минуты
желательно использовать его исключать
*желательно использование его исключать
Evg
Эксперт CАвтор FAQ
17543 / 5781 / 370
Регистрация: 30.03.2009
Сообщений: 15,923
Записей в блоге: 26
16.01.2013, 08:22     #define VS inline #22
ТС всего лишь спросил, который из двух КОНКРЕТНЫХ фрагментов кода работает быстрее, явно указав, что он знает про подводные камни при использовании препроцессора

И всё равно тема потихоньку начинается превращаться в гавносрач на тему, что одни читали в книгах, будто бы макросы это ацтой, а другие, которые понимают, что к чему, им возражают
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.01.2013, 08:41     #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. Можете вкратце...


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

Или воспользуйтесь поиском по форуму:
alex_x_x
16.01.2013, 08:41     #define VS inline
  #23

Не по теме:

Evg, дада, я даже не смотря тему по названию это определил

Yandex
Объявления
16.01.2013, 08:41     #define VS inline
Ответ Создать тему
Опции темы

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