Начиная с haXe 1.17, в язык добавлено новое ключевое слово
inline. Оно может использоваться в двух случаях: для статических переменных и для любых методов.
Статические Inline переменные
Для статических переменных всё довольно просто. Каждый раз, когда переменная используется, берётся само её значение вместо доступа к переменной. Например:
class Test {
static inline var WIDTH = 500;
static function main() {
trace(WIDTH);
}
}
Использование "inline" накладывает пару ограничений:
- переменная должна быть инициализирована при объявлении (получить значение)
- переменная не может быть изменена
(можно сказать, что "inline" переменные в haXe это аналог констант в других языках)
Главное преимущество в использовании "inline" состоит в том, что вы можете использовать столько переменных, сколько вам нужно, без замедления кода временем доступа к этим переменным, поскольку их значение подставляется напрямую в скомпилированном / сгенерированном коде.
Инлайн методы
Для методов принцип тот же. Наименее ресурсоёмкий вызов функции - тот, который никогда не производится. Для достижения этого в маленьких методах, которые часто вызываются, вы можете добавить ключевое слово "inline" в месте объявления функции.
Давайте посмотрим на пример:
class Point {
public var x : Float;
public var y : Float;
public function new(x,y) { this.x = x; this.y = y; }
public inline function add(x2,y2) { return new Point(x+x2,y+y2); }
}
class Main {
static function main() {
var p = new Point(1,2);
var p2 = p.add(2,3);
// то же самое, что написать :
var p2 = new Point(p.x+2,p.y+3);
}
}
Опять же, есть некоторые ограничения для "inline" функций:
- они не могут быть переопределены во время выполнения
- они не могут быть переопределены (override) в подклассах
- функция содержащая обращения к "super" или определяющая другую функцию не может быть "inline"
- если у "inline" функции есть аргументы, то порядок обработки аргументов не определён и некоторые аргументы могут быть вообще не обработаны, что хорошо, если только они не имеют каких-либо побочных эффектов
- если "inline" аргументы модифицируются в "inline" функции, то они в результате могут быть модифицированы и в оригинальной функции, например:
inline function setX(x) { x = 3; }
inline function foo() {
var z = 0;
setX(z);
trace(z); // 3
}
- если inline возвращает значение, то только "финальные выражения return" принимаются, например:
inline function foo(flag) { return flag?0:1; } // принимается
inline function bar(flag) { if( flag ) return 0; else return 1; } // принимается
inline function baz(flag) { if( flag ) return 0; return 1; } // не принимается
Помимо этих нескольких ограничений, использование
inline увеличивает размер компилированного / генерированного кода, но даёт большой прирос скорости исполнения маленьких методов.
Пожалуйста отметьте, что также возможно объявлять с ключевым словом inline и статические методы.
Комментарии
Отправить комментарий