gpt4 book ai didi

.net - 为什么 const long 在 IL 中转换为 short?

转载 作者:行者123 更新时间:2023-12-02 22:07:36 24 4
gpt4 key购买 nike

单纯的好奇,这段代码

    private const long constLong = 16;
private static long instanceLong = 16;

static long constTest()
{
long i = 4;
return i + constLong;
}

static long instanceTest()
{
long i = 4;
return i + instanceLong;
}

生成这个 IL:

.field private static literal int64 constLong = int64(16)
.field private static int64 instanceLong

.method private hidebysig static int64 constTest () cil managed
{
// Method begins at RVA 0x2068
// Code size 9 (0x9)
.maxstack 2
.locals init (
[0] int64 i
)

IL_0000: ldc.i4.4
IL_0001: conv.i8
IL_0002: stloc.0
IL_0003: ldloc.0
IL_0004: ldc.i4.s 16
IL_0006: conv.i8
IL_0007: add
IL_0008: ret
} // end of method Program::constTest

.method private hidebysig static int64 instanceTest () cil managed
{
// Method begins at RVA 0x2080
// Code size 11 (0xb)
.maxstack 2
.locals init (
[0] int64 i
)

IL_0000: ldc.i4.4
IL_0001: conv.i8
IL_0002: stloc.0
IL_0003: ldloc.0
IL_0004: ldsfld int64 ConsoleApplication1.Program::instanceLong
IL_0009: add
IL_000a: ret
} // end of method Program::instanceTest

为什么 constTest() 有 ldc.i4.s

    IL_0004: ldc.i4.s 16
IL_0006: conv.i8

而不是 ldc.i8 :

    IL_0004: ldc.i8 16

因为现在 constTest() 需要做一个 conv.i8 .

就像我说的,这纯粹是出于好奇。

最佳答案

这种方式更紧凑,请参阅提示的标签。

IL_0000: ldc.i4.4
IL_0001: conv.i8
IL_0002: stloc.0

这为 ldc.i4.4 占用了一个字节,为 conv.i8 占用了一个字节:总共两个字节。

IL_0004: ldc.i4.s 16
IL_0006: conv.i8
IL_0007: add

ldc.i4.s16 需要两个字节,conv.i8 需要一个字节:总共三个字节。

ldc.i8 16 指令占用 1 个字节,操作数 (16) 占用 4 个字节:总共 5 个字节。

但请记住,一旦经过 JIT(或 AOT)处理,较短的 IL 并不意味着更快(或更慢)的原生。

关于.net - 为什么 const long 在 IL 中转换为 short?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15865236/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com