Также вы можете использовать:
inflater.getContext();
, но я бы предпочел использовать
getActivity()
или
getContext
Первый (используя inline
) позволяет поместить эту функцию в заголовочный файл, где он может быть включен в несколько исходных файлов. Использование inline
делает идентификатор в области файла , подобно объявлению его static
. Без использования inline
вы получите ошибку компоновщика с несколькими символами.
Конечно, это в дополнение к подсказке компилятору о том, что функция должна быть скомпилирована inline , где он используется (избегая служебных функций вызова функции). Компилятор не должен воздействовать на подсказку inline
.
В современном компиляторе, вероятно, не так много. Он может быть встроен без inline
, и не не будет с inline
.
Да, есть разница. https://isocpp.org/wiki/faq/inline-functions .
Когда вы указываете, что функция является встроенной, вы вынуждаете компилятор поставить код метода в котором он когда-либо называется.
void myfunc() {
square(2);
}
идентичен
void myfunc() {
2 * 2;
}
Вызов функции хорош для четкости кода, но когда эта функция называется локальным состоянием, для перехода в стек, для этого метода устанавливается новое локальное состояние, и когда это делается, необходимо вывести предыдущее состояние. Это много накладных расходов.
Теперь, если вы повышаете уровень оптимизации, компилятор будет принимать решения, такие как разворачивание циклов или встроенные функции. Компилятор по-прежнему может игнорировать встроенный оператор.
-Winline
, чтобы предупредить, когда функция не будет встроена. И вы могли бы объединить это с -Werror
, если вы массачист.
– patmanpato
21 February 2016 в 22:38
inline
хорошо работает с концепцией процедурной абстракции :
inline double square (double x) { return x*x;}
int squareTwice(double x) {
double first = square(x);
double second = square(x);
return first * second;
}
Вышеупомянутое в корне похоже на следующее:
int squareTwice(double x) {
double first = x*x;
double second = x*x;
return first * second;
}
Это происходит потому, что когда компилятор inline-расширяет вызов функции, код функции вставляется в поток кода вызывающего; поэтому, может быть, проще подвергнуть процедуре абстрагирование второго примера к первому примеру.
Процедурная абстракция позволяет разбить подпрограмму на более мелкие подпрограммы, которые намного легче читать (хотя это может быть стиль выбор).
Встроенная функция, если компилятор отвечает, будет включать встроенную функцию в код, в котором она была вызвана, как если бы не вызывалась функция (как если бы вы поместили логику в вызывающую функцию) и избегаете служебных вызовов функции .
Материал из Википедии: функция Inline - это функция, с которой компилятор запросил выполнить встроенное расширение. Другими словами, программист запросил, чтобы компилятор вставлял полный кусок функции в каждое место, вызываемое функцией, а не генерировал код для вызова функции в одном месте, где он определен. Компиляторы не обязаны соблюдать этот запрос.
static
. Если бы это было так, каждая единица перевода имела бы свою собственность над своей копией функции, и компоновщик рассматривал бы их как разные функции (которые имели одно и то же имя). Напротив,inline
инструктирует компоновщика, что, если он видит различные определения этой функции, они все одинаковы и должны быть объединены в один. Но игнорируя эту деталь, она, по большей части, ведет себя так, как если бы она былаstatic
. – GManNickG 12 May 2011 в 00:54inline
не может предотвратить поиск vtable, вам нужно вызвать девиртуализацию i> для этого. – Ben Voigt 12 May 2011 в 00:54