在托管语言中避免分支机构

MBy*_*ByD 6 c# managed-code

C中,当编译到x86机器时,我通常会用逻辑表达式替换分支,当速度是最重要的方面时,即使条件很复杂,例如,而不是

char isSomething() {
    if (complexExpression01) {
        if (complexExpression02) {
            if(!complexExpression03) {
                return 1;
            }
        }
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我会写:

char isSomething() {
    return complexExpression01 &&
           complexExpression02 &&
           !complexExpression03 ;
}
Run Code Online (Sandbox Code Playgroud)

现在显然,这可能更难维护,代码可读性更低,但实际上可能更快.

在使用托管代码(例如C#)时,是否有任何理由采取相同的方式?托管代码中的"跳转"是否昂贵,因为它们处于非托管代码中(至少在x86上)?

Ulr*_*sen 1

这两个表达式将导致相同数量的测试,因为逻辑与运算符 ( &&) 在 C 和 C# 中都具有短路语义。因此,你的问题的前提(表达程序的第二种方式会导致更少的分支)是不正确的。