似乎找不到这些问题的好答案。
以下是我认为自己已经了解的和我模糊的知识。
- 评估堆栈是一个类似于C风格堆栈的内存缓冲区(它是本机int / size_t的堆栈吗)?
- 评估堆栈元素可以是32位或64位(如何在单个堆栈中混合这些元素?)
- Ldloc_0将局部变量存储在评估堆栈上,但如果它大于64位怎么办?
- Ldloc_0是否只在评估堆栈上存储指向局部变量的指针?
- 在评估堆栈上存储的对象是否总是指针或原始值?
- 如果.maxsize为8,那么是否意味着(8 * size_t)?如果是这样,那么如果我读到文档说明它是32位或64位怎么办?
以下面的示例为例。这个局部变量会通过指针引用存储在评估堆栈上吗?
public struct MyStruct
{
public long x, y, z;
public static MyStruct Foo()
{
MyStruct c;
c.x = 1;
c.y = 2;
c.z = 3;
return c;
}
}
"
“ldloc.0”将结构体明确存储到计算堆栈中,但它比64位还要大。这里是否存储了引用?
".class public sequential ansi sealed beforefieldinit MyStruct
extends [mscorlib]System.ValueType
{
// Fields
.field public int64 x
.field public int64 y
.field public int64 z
// Methods
.method public hidebysig static
valuetype MyStruct Foo () cil managed
{
// Method begins at RVA 0x2050
// Code size 34 (0x22)
.maxstack 2
.locals init (
[0] valuetype MyStruct,
[1] valuetype MyStruct
)
IL_0000: nop
IL_0001: ldloca.s 0
IL_0003: ldc.i4.1
IL_0004: conv.i8
IL_0005: stfld int64 MyStruct::x
IL_000a: ldloca.s 0
IL_000c: ldc.i4.2
IL_000d: conv.i8
IL_000e: stfld int64 MyStruct::y
IL_0013: ldloca.s 0
IL_0015: ldc.i4.3
IL_0016: conv.i8
IL_0017: stfld int64 MyStruct::z
IL_001c: ldloc.0// What is actually stored here?
IL_001d: stloc.1
IL_001e: br.s IL_0020
IL_0020: ldloc.1
IL_0021: ret
} // end of method MyStruct::Foo
} // end of class MyStruct