@pragma("vm:prefer-inline") 在 Flutter 中是什么意思?

23

我看到很多框架中有这样的代码:

@pragma

@pragma注释是做什么用的?

@pragma("vm:entry-point", "call")
@pragma("vm:entry-point", "set")
@pragma("vm:entry-point", "get")
@pragma("vm:prefer-inline")`
......
2个回答

23

关于@pragma的一般含义,请参考上述NKSM答案

我将引用两个重要的具体用例:

  • @pragma('vm:prefer-inline') 用于内联函数

    (我指的是编译时内联,这与“内联函数”作为闭包/lambda的同义词无关,有时会这样做)

    此注释类似于Kotlin中的inline关键字

  • @pragma("vm:entry-point")用于标记函数(或其他实体,如类),以向编译器指示它将从本地代码中使用。如果没有此注释,dart编译器可能会削减未使用的函数、内联函数、缩小名称等,而本机代码将无法调用它。

    关于entry-point的非常好的文档(比通常更清晰)在https://github.com/dart-lang/sdk/blob/master/runtime/docs/compiler/aot/entry_point_pragma.md中。

如果你想在Dart中进行内联的第一次测试,我建议你使用dart2js编译,这将输出相当易读的JavaScript代码(至少在缩小级别超出默认级别之前;并且可读性显然仅在最小程序中达到)。但是,在Dart/JS中进行内联需要略微不同的@pragma注释:@pragma('dart2js: tryInline')

关于Dart中的内联的有趣讨论可以在dart-lang issue #40522 - Annotation for method inlining中找到。

总的来说,我推荐Mraleph博客。他的最新文章是关于 在Dart中进行基准测试,并展示了@pragma(vm:entry-point)的使用。Mraleph是Dart SDK开发人员(他也是上面引用的官方文档的作者),对于与Dart VM相关的主题,这是一个非常宝贵的资源。


8

Flutter使用Dart编程语言。

Pragma类是向工具提供的一种提示。

处理Dart程序的工具可以接受在声明上作为pragma注释的提示来指导它们的行为。每个工具都决定接受哪些提示、它们的意义以及它们是否以及如何应用于注释实体的子部分。

识别pragma提示的工具应该选择一个pragma前缀来标识该工具。如果提示名称以该前缀开头,后跟:,则应该将其视为针对该工具而发出的提示。 对于另一个工具的前缀提示应该被忽略(除非与那个工具的兼容性是目标)。

如果提示可以参数化,则还可以添加额外的选项对象。

例如:

@pragma('Tool:pragma-name', [param1, param2, ...])
class Foo { }

@pragma('OtherTool:other-pragma')
void foo() { }
Foo类使用工具特定的编译指示符“”进行注释,而函数foo则使用针对其他工具的编译指示符“”进行注释。
上述内容可以在dart.dev文档中找到。
此处的注解@pragma('vm:entry-point'),其核心逻辑是树摇。在AOT(提前编译)编译中,如果它不能由应用程序的主入口调用,它将被作为无用代码丢弃。AOP代码的注入逻辑是非侵入式的,因此显然不会被主入口调用。因此,需要使用此注解告诉编译器不要丢弃此逻辑。

8
这并没有回答这个问题。 - nt4f04und
2
虽然@nt4f04und还没有给出具体方法,但他提出了一个想法。我基本了解pragma的作用,但我仍然不太清楚它如何工作。 - VillainLin
1
这几乎完全是从官方文档中复制粘贴过来的。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接