struct Foo bar::Int -6ren">
gpt4 book ai didi

julia - 是否有理由将 @static 放在 if VERSION 语句之前?

转载 作者:行者123 更新时间:2023-12-04 02:28:28 25 4
gpt4 key购买 nike

比如前面这个:

@static if v"0.2" <= VERSION < v"0.3-"
# do something specific to 0.2 release series
end

@static 有必要吗?

最佳答案

除了@DVNold 的回答,这里还有更多解释......

一、两者的区别:

  • if 在全局范围内,条件和选择的任何分支都会在运行该代码时进行评估;
  • @static if 在解析代码时(在宏扩展期间)评估条件,并替换为条件选择的任何分支的代码 - 没有留下 if宏观扩张后。

在顶级全局范围内,这两者之间没有太大区别,因为评估只发生一次,在代码被解析、宏扩展和降低之后。但是,在某些情况下,您无法在句法上放置 if 表达式。一个很好的例子是,如果您希望结构中某个字段的存在或不存在以某些条件为条件:

have_baz_field = rand(Bool)

struct Foo
bar::Int
@static if have_baz_field
baz::Int
end
end

下面是这段代码的两个不同的评估:

julia> have_baz_field = rand(Bool)
false

julia> struct Foo
bar::Int
@static if have_baz_field
baz::Int
end
end

julia> fieldnames(Foo)
(:bar,)
julia> have_baz_field = rand(Bool)
true

julia> struct Foo
bar::Int
@static if have_baz_field
baz::Int
end
end

julia> fieldnames(Foo)
(:bar, :baz)

当然,随机有或没有字段不是很有用;在实践中,您希望有一个更有意义的条件来决定是否拥有该字段,可能是基于您在尝试匹配 C 结构的布局时所在的平台。

在本地范围内,if@static if 之间有更多区别,因为代码可以被计算多次,而它只被解析一次。由于条件是在表达式出现的全局范围内在解析时求值的,@static if 形式无法访问任何局部变量,因为在扩展宏时它们不存在。另一方面,如果非静态 if 的条件仅基于全局常量,编译器很有可能可以预测条件的值,因此仍然可能没有任何有效差异,因为编译器将消除无论如何,除了已采取的分支之外的所有代码。然而,如果你想确保这发生在解析/编译时,那么你可以使用 @static if 来强制它。

希望这能澄清差异。简而言之,您很少需要 @static if,因为它通常在顶级范围内甚至在本地范围内都是等效的,在您可以使用 @static if 的情况下,编译器将反正可能已经做了同样的事情。在某些情况下,在全局范围内需要 @static if,因为分支在语法上是不允许的。在本地范围内,通常没有必要,但可能希望真正确保在运行时不评估条件。在大多数代码中,您不需要 @static if。例如,在问题中给出的示例中,我个人只使用 if 并省略 @static 因为表达式出现在顶层并且仅评估条件一次。

关于julia - 是否有理由将 @static 放在 if VERSION 语句之前?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65720502/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com