C# 如何防止编译器生成比较指令而不是分支指令?
给定分支指令(来自)的以下相同属性:C# 如何防止编译器生成比较指令而不是分支指令?,c#,bytecode,cil,opcode,C#,Bytecode,Cil,Opcode,给定分支指令(来自)的以下相同属性: blt:执行clt指令,然后执行指向特定目标指令的brtrue分支的效果相同 bgt:执行cgt指令,然后执行指向特定目标指令的brtrue分支的效果相同 bge:执行clt指令(clt.un用于浮动)后执行brfalse分支到特定目标指令的效果是相同的 beq:其效果与执行ceq指令,然后执行指向特定目标指令的brtrue分支相同 事实证明,编译器通常会通过转换布尔运算符(如“)来优化控制流。我编写了一个生成器,它能够确保方法定义包含分支变量而不是比较变量
事实证明,编译器通常会通过转换布尔运算符(如“)来优化控制流。我编写了一个生成器,它能够确保方法定义包含分支变量而不是比较变量。它通过为分支变量构建一个完整的方法体来实现这一点。此生成器仅适用于文档中所示的方法。我在测试中使用的这种方法
//
///条件分支语句的生成器。
///此生成器仅适用于以下方法结构:
///*如果满足条件,则返回true
///*如果不满足条件,则返回false
///*两个int参数。
///*如果检查条件,则为一个。
/// ```
///公共布尔条件检查(内部左侧、内部右侧)
/// {
///如果(左侧(任何条件)右侧)
/// {
///返回true;
/// }
///返回false;
/// }
/// ```
///在某些情况下,编译器可以生成类似clt/cgt的“比较”,而不是分支变量blt/bgt。
///当与分支变量进行比较时,此生成器能够重写方法体。
///
内部类条件分支生成器
{
专用只读列表\u指令;
///
///通过传入将在生成过程中使用的分支运算符生成新实例。
///只接受bgt/blt/beq等分支运算符。。
///
///
公共条件分支生成器(操作码比较)
{
var ia=指令.Create(操作码.Ldloc_1);
var ib=指令.Create(操作码.Ret);
var i7=指令.Create(操作码.Ldc_I4_1);
//加载两个参数布尔值
var i1=指令.Create(操作码.Ldarg_1);
var i2=指令.Create(操作码.Ldarg_2);
//如果比较结果为真,则分支为i7。
var i3=指令.Create(比较,i7);
//如果比较为false,则加载“0”(false)并返回分支。
var i4=指令.Create(操作码.Ldc_i4_0);
var i5=指令.Create(操作码.Stloc_1);
var i6=指令.Create(操作码.Br_S,ia);
var i8=指令.Create(操作码.Stloc_1);
var i9=指令.Create(操作码.Br_S,ia);
i1.下一个=i2;
i2.Next=i3;
i3.Next=i4;
i4.下一个=i5;
i5.下一个=i6;
i6.下一个=i7;
i7.Next=i8;
i8.Next=i9;
i9.Next=ia;
ia.Next=ib;
i2.先前=i1;
i3.先前=i2;
i4.先前=i3;
i5.先前=i4;
i6.先前=i5;
i7.先前=i6;
i8.先前=i7;
i9.先前=i8;
ia.Previous=i9;
ib.先前=ia;
i1.偏移量=0;
i2.偏移量=1;
i3.偏移量=2;
i4.偏移量=3;
i5.偏移量=4;
i6.偏移量=5;
i7.偏移量=6;
i8.偏移量=7;
i9.偏移量=8;
ia.偏移量=9;
ib.偏移量=10;
_说明=新列表
{
i1,i2,i3,i4,i5,i6,i7,i8,i9,ia,ib
};
}
///
///替换方法体时,正在与分支变量进行比较。
///请注意,方法定义必须符合类级注释中注明的严格规则。
///
///
公共无效替换方法说明(方法定义方法)
{
方法.Body.Instructions.Clear();
foreach(var指令在_指令中)
方法.正文.说明.添加(说明);
}
}
我编写了一个生成器,它能够确保方法定义包含分支变量而不是比较变量。它通过为分支变量构建一个完整的方法体来实现这一点。此生成器仅适用于文档中所示的方法。我在测试中使用的这种方法
//
///条件分支语句的生成器。
///此生成器仅适用于以下方法结构:
///*如果满足条件,则返回true
///*如果不满足条件,则返回false
///*两个int参数。
///*如果检查条件,则为一个。
/// ```
///公共布尔条件检查(内部左侧、内部右侧)
/// {
///如果(左侧(任何条件)右侧)
/// {
///返回true;
/// }
///返回false;
/// }
/// ```
///在某些情况下,编译器可以生成类似clt/cgt的“比较”,而不是分支变量blt/bgt。
///此生成器能够重写方法