W>Вообще, для хорошего вопроса стоило бы написать классическую тройку: что ты делаешь, что ожидаешь получить, и что получаешь.
W>И ты даже язык (и его версию) не указал, хотя это тоже важно: ведь в С и в С++ ключевое слово inline у функций играет весьма разную роль.
Использую с++ gcc v10.2 на Windows, объявляю глобальную функцию inline ожидаю что её тело включиться в вызвавшую функцию и её не будет в exe.
Cмотрю map файл и вижу что она присутствует в exe. Так же смотрел ассемблерный файл (созданный через gcc -S) и вижу там call на эту функцию.
Здравствуйте, maks1180, Вы писали:
M>Использую с++ gcc v10.2 на Windows, объявляю глобальную функцию inline ожидаю что её тело включиться в вызвавшую функцию и её не будет в exe. M>Cмотрю map файл и вижу что она присутствует в exe. Так же смотрел ассемблерный файл (созданный через gcc -S) и вижу там call на эту функцию.
Компилятор сам решает, инлайнить функцию или нет. Ключевое слово inline к этому отношения не имеет в современном C++. Оно нужно только чтобы объявить реализацию функции в нескольких юнитах компиляции (иными словами в хедере).
Здравствуйте, maks1180, Вы писали:
M>объявляю функцию inline но gcc все равно делает её отдельно. Почему так ?
Вообще это обычное поведение всех современных компиляторов.
"inline" это только предложение компилятору рассмотреть функцию
как кандидата на "inline", в компиялторах обычно есть всякие эвристики
для определения стоит это делать или нет, от количества инструкций в теле
функции до того сколько раз в этой единице компиляции компилятор уже
делал inline.
И насколько я понимаю причина этого то, что разработчики
слишком усердствуют с использованием этого ключевого слова в C++,
и если тупо "проинлайнить" все, то будут получаться огромные исполняемые
файлы, во время выполнения которых кэш инструкций все время будет
подсасывать данные из памяти, тем самым на порядок замедляя программу.
Ну и как во всех современных компиляторах в gcc есть способ заставить
компилятор сделать функцию встраиваемой, в gcc это "__attribute__((always_inline))".
Здравствуйте, vsb, Вы писали:
vsb>Компилятор сам решает, инлайнить функцию или нет. Ключевое слово inline к этому отношения не имеет в современном C++.
Формально последнее утверждение не совсем до конца верное: в стандарте С++ до сих пор сохраняется роль подсказки для этого ключевого слова [dcl.inline]. Подсказки, которую конечно же игнорируют, как и разрешено в этом же абзаце. Не только потому что PGO работает сильно лучше, но и потому что статический анализ кода тоже неплохо с этим справляется, чем хинты непонятной важности. Но упоминание об этой роли всё же есть
Здравствуйте, maks1180, Вы писали:
M>Использую с++ gcc v10.2 на Windows, объявляю глобальную функцию inline ожидаю что её тело включиться в вызвавшую функцию и её не будет в exe. M>Cмотрю map файл и вижу что она присутствует в exe. Так же смотрел ассемблерный файл (созданный через gcc -S) и вижу там call на эту функцию.
Декларация inline это всего то рекомендация компилятору. Есть специальные __forceinline для винды и не помню уже какой аттрибут для гнуси чтоб заставить компилер заинлайнить.