C# 优化组合 Return 语句

C# Optimisation Combining Return Statements

我使用 Visual Studio 在 C# 中编写了一个函数,并决定查看在启用 'optimize code' 构建标志的情况下进行编译时的效果。

我用 dnSpy 检查了 DLL,发现 if 语句已被删除。这导致每次调用函数时都访问 neighbour.data 数组,这是我试图避免的。

这是Visual Studio中的函数:

[MethodImpl(MethodImplOptions.AggressiveInlining)]
protected bool DrawFaceXNegative(int j, int k, int chunkPosition, Chunk neighbour)
{
    // These two if statements are here to prevent an array access if possible
    if (chunkPosition == 0)
        return false;

    if (neighbour == null)
        return true;

    return neighbour.data[31 * Constants.ChunkSize + j + k * Constants.ChunkSizeSquared].index == 0;
}

这是 dnSpy 中的函数:

[MethodImpl(MethodImplOptions.AggressiveInlining)]
protected bool DrawFaceXNegative(int j, int k, int chunkPosition, Chunk neighbour)
{
    return chunkPosition != 0 && (neighbour == null || neighbour.data[992 + j + k * 1024].index == 0);
}

将逻辑更改为 if-else 语句会产生相同的结果。有没有办法阻止这种优化的发生?

作为附带问题,是什么导致编译器认为生成的函数更优化?

return chunkPosition != 0 && ...

正在做与

完全相同的事情
  if (chunkPosition == 0)
        return false;

chunkPosition为0的情况下:

  1. 根据 && 规则停止剩余的计算
  2. 它return是假的

如果这部分的计算结果为真,return 值将是 true && (neighbour == null || neighbour.data[992 + j + k * 1024].index == 0); - 所以无论省略号的结果如何。

&& 连接的东西被执行,直到你遇到第一个 false。

||连接的东西被执行,直到你命中第一个 true。

如果你想让所有的代码一直执行,我想单字符版就是你要找的droid