gcc inline
От: maks1180  
Дата: 10.11.22 20:01
Оценка:
объявляю функцию inline но gcc все равно делает её отдельно. Почему так ?
===============================================
(реклама, удалена модератором)
Re: gcc inline
От: watchmaker  
Дата: 10.11.22 20:07
Оценка:
Здравствуйте, maks1180, Вы писали:

M>объявляю функцию inline но gcc все равно делает её отдельно. Почему так ?


А почему бы и нет?

Вообще, для хорошего вопроса стоило бы написать классическую тройку: что ты делаешь, что ожидаешь получить, и что получаешь.

И ты даже язык (и его версию) не указал, хотя это тоже важно: ведь в С и в С++ ключевое слово inline у функций играет весьма разную роль.
Re[2]: gcc inline
От: maks1180  
Дата: 10.11.22 20:59
Оценка:
W>Вообще, для хорошего вопроса стоило бы написать классическую тройку: что ты делаешь, что ожидаешь получить, и что получаешь.

W>И ты даже язык (и его версию) не указал, хотя это тоже важно: ведь в С и в С++ ключевое слово inline у функций играет весьма разную роль.


Использую с++ gcc v10.2 на Windows, объявляю глобальную функцию inline ожидаю что её тело включиться в вызвавшую функцию и её не будет в exe.
Cмотрю map файл и вижу что она присутствует в exe. Так же смотрел ассемблерный файл (созданный через gcc -S) и вижу там call на эту функцию.
===============================================
(реклама, удалена модератором)
Re[3]: gcc inline
От: vsb Казахстан  
Дата: 10.11.22 21:08
Оценка: +2
Здравствуйте, maks1180, Вы писали:

M>Использую с++ gcc v10.2 на Windows, объявляю глобальную функцию inline ожидаю что её тело включиться в вызвавшую функцию и её не будет в exe.

M>Cмотрю map файл и вижу что она присутствует в exe. Так же смотрел ассемблерный файл (созданный через gcc -S) и вижу там call на эту функцию.

Компилятор сам решает, инлайнить функцию или нет. Ключевое слово inline к этому отношения не имеет в современном C++. Оно нужно только чтобы объявить реализацию функции в нескольких юнитах компиляции (иными словами в хедере).
Re: gcc inline
От: Zhendos  
Дата: 10.11.22 21:20
Оценка: 3 (2) +2
Здравствуйте, maks1180, Вы писали:

M>объявляю функцию inline но gcc все равно делает её отдельно. Почему так ?


Вообще это обычное поведение всех современных компиляторов.
"inline" это только предложение компилятору рассмотреть функцию
как кандидата на "inline", в компиялторах обычно есть всякие эвристики
для определения стоит это делать или нет, от количества инструкций в теле
функции до того сколько раз в этой единице компиляции компилятор уже
делал inline.

И насколько я понимаю причина этого то, что разработчики
слишком усердствуют с использованием этого ключевого слова в C++,
и если тупо "проинлайнить" все, то будут получаться огромные исполняемые
файлы, во время выполнения которых кэш инструкций все время будет
подсасывать данные из памяти, тем самым на порядок замедляя программу.

Ну и как во всех современных компиляторах в gcc есть способ заставить
компилятор сделать функцию встраиваемой, в gcc это "__attribute__((always_inline))".
Отредактировано 11.11.2022 2:32 Zhendos . Предыдущая версия .
Re: gcc inline
От: velkin Удмуртия http://blogs.rsdn.org/effective/
Дата: 10.11.22 21:26
Оценка:
Здравствуйте, maks1180, Вы писали:

M>объявляю функцию inline но gcc все равно делает её отдельно.


Попробуй скомпилировать clang. Говорят gcc отклоняется от стандартов. Если и clang не будет делать как надо, тогда .
Re[4]: gcc inline
От: watchmaker  
Дата: 10.11.22 21:41
Оценка:
Здравствуйте, vsb, Вы писали:

vsb>Компилятор сам решает, инлайнить функцию или нет. Ключевое слово inline к этому отношения не имеет в современном C++.


Формально последнее утверждение не совсем до конца верное: в стандарте С++ до сих пор сохраняется роль подсказки для этого ключевого слова [dcl.inline]. Подсказки, которую конечно же игнорируют, как и разрешено в этом же абзаце. Не только потому что PGO работает сильно лучше, но и потому что статический анализ кода тоже неплохо с этим справляется, чем хинты непонятной важности. Но упоминание об этой роли всё же есть
Re[3]: gcc inline
От: CreatorCray  
Дата: 11.11.22 00:38
Оценка:
Здравствуйте, maks1180, Вы писали:

M>Использую с++ gcc v10.2 на Windows, объявляю глобальную функцию inline ожидаю что её тело включиться в вызвавшую функцию и её не будет в exe.

M>Cмотрю map файл и вижу что она присутствует в exe. Так же смотрел ассемблерный файл (созданный через gcc -S) и вижу там call на эту функцию.

Декларация inline это всего то рекомендация компилятору. Есть специальные __forceinline для винды и не помню уже какой аттрибут для гнуси чтоб заставить компилер заинлайнить.
... << RSDN@Home 1.3.110 alpha 5 rev. 62>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.