首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >组合返回语句的C#优化

组合返回语句的C#优化
EN

Stack Overflow用户
提问于 2019-11-14 01:14:05
回答 1查看 151关注 0票数 0

我使用Visual在C#中编写了一个函数,并决定在使用启用了“优化代码”构建标志的情况下查看它的外观。

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

下面是Visual中的函数:

代码语言:javascript
复制
[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中的函数:

代码语言:javascript
复制
[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语句会产生相同的结果。是否有办法防止这种优化的发生?

作为一个附带的问题,是什么使编译器相信产生的函数是更优化的?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-14 01:26:07

代码语言:javascript
复制
return chunkPosition != 0 && ...

正在做同样的事情

代码语言:javascript
复制
  if (chunkPosition == 0)
        return false;

对于chunkPosition为0的情况,它:

  1. 停止计算的其余部分,参数&规则
  2. 它返回false

如果此部分计算为true,则返回值将为true && (neighbour == null || neighbour.data[992 + j + k * 1024].index == 0); --因此无论结果如何。

&&连接的东西会被执行,直到你碰到第一个错误。

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

如果您希望所有的代码都被执行,我认为单一字符版本是您正在寻找的机器人。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58847970

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档