gpt4 book ai didi

if-statement - 编译器如何处理已部分应用的 boolean 参数?

转载 作者:行者123 更新时间:2023-12-01 23:03:28 26 4
gpt4 key购买 nike

我读了一篇关于函数的 boolean 参数的有趣文章:

https://medium.com/compileswift/clean-code-the-curse-of-a-boolean-parameter-c237a830b7a3

作者认为,在许多情况下,最好将具有 boolean 参数的函数一分为二。这是因为 boolean 参数的使用增加了代码的圈复杂度

所以考虑以下简单的函数:

let fbool (b: bool) (x: int) =
if b then x
else -x

接下来,定义一个从偏应用定义的函数,如下:

let ftrue x = fbool true x

或等效

let ftrue = fbool true

F# 编译器是否足够聪明,可以按照作者的建议去做,即上面定义的 ftrue 是一个不包含 if 语句的函数,因此不会不会导致圈复杂度?还是它包含一个 if 语句,但碰巧总是选择 true 分支?

最佳答案

F# 编译器不够聪明,无法消除这样的分支。一般来说,.NET 中的编译器只应用很少的优化,希望抖动会为它们优化。

如果你将 fbool 函数内联 ftrue 会像这样结束:

public static int ftrue(int v)
{
bool flag = true;
if (flag)
{
return v;
}
return -v;
}

这里编译器“显然”应该消除分支,但它没有。

但是,您可能很幸运,代码复杂性工具意识到其中一个分支永远不会被采用,并且不会将此测试添加到 CC 分数中。

关于if-statement - 编译器如何处理已部分应用的 boolean 参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45340037/

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