LINUX.ORG.RU

Имеет ли смысл использовать inline в современном GNU C/C++?


0

3

Имеет ли смысл директива «inline» в современном GNU C/C++?
Может быть, компилятор стал настолько интеллектуален, что во всех случаях оптимизирует уже без неё?
Код:

inline int GetR(int k) {
  return ((k/(16*16))%16)*16+0x07;
}

★★★★★

В C стоит объявлять такие функции static inline и описывать их в заголовочном файле.

В C++, слышал, по-другому.

ttnl ★★★★★
()

off: мне попадалось, что удаление inline из чужих сорцов ускоряло программулину. Вывод: если быдлокодер, то не лезь куда не разбираешься, блеать!

anonymous
()
Ответ на: комментарий от ttnl

Да, про static inline я смутно помню из сорцов времен 70-80-х.

C++, слышал, по-другому.


Ок, буду смотреть живой код тогда.

pacify ★★★★★
() автор топика

Может быть, компилятор стал настолько интеллектуален, что во всех случаях оптимизирует уже без неё?

в любом разе надо представлять что происходит и не бежать вперёд паровоза«оптимизацию наводить» только потому что левая пятка зачесалась

стандартный цикл разработки:
1. сделай чтобы это работало
2. сделай чтобы это работало правильно
3. сделай чтобы это работало быстро (если надо)

shty ★★★★★
()

>Может быть, компилятор стал настолько интеллектуален, что во всех случаях оптимизирует уже без неё?

ЕМНИП, все функции, объявленные прямо в теле класса, компилятором неявно считаются рекомендованными как inline.

И даже если объявить явно inline, нет гарантии, что современный компилятор функцию действительно встроит.

>Имеет ли смысл директива «inline» в современном GNU C/C++?

Нет.

schizoid ★★★
()

По скромному личному опыту - имеет;-)

В данном конкретном случае я бы глянул выхлоп, */16 лучше делать через побитовый сдвиг (хотя компайлер вроде сам до этого додумывается). И простенькие ф-ии опять таки он сам инлайнит.

А вообще, для оптимизации есть единственный универсальный алгоритм: че та «соптимизировал» - проверь производительность. Иначе это не оптимизация, а мифологизация... кто то истово верит что инлайны вредны/полезны, кто то убежден разименование пойнтеров ужжжастно долгая операция...

AIv ★★★★★
()

То ли Саттер, то ли Александреску писали, что inline сейчас не несет никакого смысла. Вообще, по стандарту, эта директива только предлагает компилятору, но не навязывает.

panter_dsd ★★★★
()

Нужно смотреть на сгенерированный код после inline. Если интересует оптимизация, нужно смотреть в сторону ключей компилятора.

sched
()

> Имеет ли смысл директива «inline» в современном GNU C/C++?

Странный вопрос. Имеет ли смысл ключевое слово ЯП в современном компиляторе этого ЯП?

Присоединюсь к тому что inline скорее рекомендация компилятору. Читайте стандарт, не уповайте на «современность» ).

nikitos ★★★
()
Ответ на: комментарий от unsigned

Слинковаться с чем?

например, слинковать исполянемый файл

Для функции в хедере нужен static.

убивать !

Reset ★★★★★
()
Ответ на: комментарий от Reset

попробую создай функцию полностью в хедере без inline, а потом попробуй слинковаться, а я посмеюсь

Он сейчас приведёт пример с одним-единственным сишником и одним хедером. И у него слинкуется.

Miguel ★★★★★
()
Ответ на: комментарий от Miguel

В реальной жизни обычно один h-ник и 100500 сишников :)

Reset ★★★★★
()
Ответ на: комментарий от nikitos

Странный вопрос. Имеет ли смысл ключевое слово ЯП в современном компиляторе этого ЯП?

А теперь раскажи нам какой смысл имеет слово register для современного компилятора C++.

Begemoth ★★★★★
()
Ответ на: комментарий от unsigned

Ругань компилятора на unused static function и куча лишнего кода, который появится в бинаре. msvc нормально вырезает unused, а вот gcc не всегда. Поэтому только inline.

Reset ★★★★★
()
Ответ на: комментарий от unsigned

Например, чтобы сделать класс, который можно использовать с любым компилятором (GNU, MSVC, Borland, ...). Имеется в виду без перекомпиляции бинарников.

abalakin ★★
()
Ответ на: комментарий от panter_dsd

А ещё есть BOOST_FORCE_INLINE, который вроде как про эти директивы знает и подставляет нужные.

DELIRIUM ☆☆☆☆☆
()
Ответ на: комментарий от Begemoth

> какой смысл имеет слово register для современного компилятора C++.

А оно ещё живое?

Я как-то уже давно в плюсовой стандарт не заглядывал - думал register уже выпилили из него. Для «обратной совместимости» что ли оставили? :)

OldFatMan
()
Ответ на: комментарий от OldFatMan

Для «обратной совместимости» что ли оставили? :)

Ну да, как и auto в C++98.

Begemoth ★★★★★
()
Ответ на: комментарий от amaora

Нельзя будет взять адрес?

Можно, предупреждение gcc выдаёт только с -Wextra.

Begemoth ★★★★★
()

Зависит от компилятора. На некоторых, вроде как ускоряло.

cattail
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.