Inline

Начиная с 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 и статические методы.

Комментарии

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <blockcode> <dd>
  • Строки и параграфы переносятся автоматически.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • You can enable syntax highlighting of source code with the following tags: <code>, <blockcode>.

Подробнее о форматировании

CAPTCHA
Этот вопрос помогает предотвратить автоматический спам
Image CAPTCHA
Enter the characters shown in the image without spaces, also respect upper and lower case.
To prevent automated spam submissions leave this field empty.