我使用Visual在C#中编写了一个函数,并决定在使用启用了“优化代码”构建标志的情况下查看它的外观。
我使用dnSpy检查了DLL,并注意到if语句已被删除。这会导致每次调用函数时都会访问neighbour.data数组,这正是我试图避免的。
下面是Visual中的函数:
[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语句会产生相同的结果。是否有办法防止这种优化的发生?
作为一个附带的问题,是什么使编译器相信产生的函数是更优化的?
发布于 2019-11-14 01:26:07
return chunkPosition != 0 && ...正在做同样的事情
if (chunkPosition == 0)
return false;对于chunkPosition为0的情况,它:
如果此部分计算为true,则返回值将为true && (neighbour == null || neighbour.data[992 + j + k * 1024].index == 0); --因此无论结果如何。
&&连接的东西会被执行,直到你碰到第一个错误。
连接的东西会被执行,直到你命中第一个真。
如果您希望所有的代码都被执行,我认为单一字符版本是您正在寻找的机器人。
https://stackoverflow.com/questions/58847970
复制相似问题