FriendOfAsherah Ответов: 4

Когда компилятор выполняет встроенную функцию? С++


Перечитал теперь много арикелей и не получил его, не нашел и компендиума. Я совершенно запутался!
Вот правила, которые я узнал:
это верно????

А) встроенный ключ теперь устарел в C++11, компилятор всегда решает сам
int add(int x) { return x+1; } 
inline int add(int x) { return x+1; }

сделайте то же самое!

Б) тело функции должно быть помещено в объявление класса или, если оно не является членом класса, в файл cpp, где оно используется.
.ч:
virtual int add(int x);
.СРР
int myclass::add(int x) { return x+1 }

никогда не будет встроен ???

Visual Studio 2013, C++ и некоторые MFC

(У нас есть много функций дампа, которые ничего не делают или возвращают только true/false в нашем коде C++ )

Что я уже пробовал:

прочитал много статей, веб-форумов, но ничего не понял.
И что? Есть ли способ узнать, что сделал компилятор?

спасибо, ребята!

4 Ответов

Рейтинг:
33

Jochen Arndt

Он зависит от компилятора, а также зависит от параметров генерации / оптимизации кода. Таким образом, вы должны проверить конкретную документацию компилятора. О компиляторе Microsoft см. Встроенные Функции (C++)[^].

Единственный надежный способ проверить, была ли функция встроена или нет, - это проверка сгенерированного кода (например, с помощью вывода сборки с помощью /FA, /Fa (файл листинга)[^] опция или проверка таблицы символов).


FriendOfAsherah

это отвечает на)
попробую с выключателями
Б) все еще открытый

Рейтинг:
16

Stefan_Lang

А) инлайнинг-это оптимизация кода, а современные компиляторы уже намного лучше оптимизируют код, чем программисты*. Из-за этого оставить решение компилятору почти всегда является лучшим вариантом. Это было не всегда так, поэтому в прошлом для разработчиков компиляторов имело смысл просить программистов о подсказке в виде inline ключевое слово. Однако C++11 признает, что это больше не имеет смысла.

Б) virtual функций быть не может inlined во время компиляции, потому что какая функция должна быть вызвана, должно быть решено во время выполнения.**

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


FriendOfAsherah

жаль должно быть 5**** не может измениться

Stefan_Lang

Все равно спасибо. Рад помочь.

Рейтинг:
1

CPallini

Компилятор выбирает. Смотрите, например встроенный спецификатор - cppreference.com[^].


FriendOfAsherah

этот ответ А) - Б) все еще открыт

Рейтинг:
1

FriendOfAsherah

ОК -
А) ответ-задача компилятора ist, как я и предполагал
Б) имеет ли смысл помещать короткие функции в объявления или нет
на некоторых форумах я читал, что компилятор не может оптимизировать, когда функция не находится в том же файле, что и объявление класса:

@Stefan_Lang: хороший вклад, никогда не читал об этой точке зрения.

Теперь я написал короткий тест: отдельные файлы или тело функции в объявлении класса и т. д. ... Используя переключатели, которые сказал нам @Jochen Arndt.

Вообще: компилятор делает то, что он считает лучшим, а также funbodies вне объявления класса были оптимизированы и встроены