我知道其他人写了类似的问题,但我认为我的情况不同,因为我找不到任何解决方案.
我有一个对象赋值,这个非常简单:
_buffer3 = buffer; //they are just simple reference types
生成的汇编代码如下
mov edx,dword ptr [ebp-3Ch] mov eax,dword ptr [ebp-40h] lea edx,[edx+4] call 69C322F0
现在,只是为了理解发生了什么,我想进入呼叫(为什么要在分配中使用呼叫?).但是,该地址的代码不存在,我无法介入.如果我在地址代码字段中键入地址,那就是显示的内容:
69C322F0 ???
试图解决这个问题的任何帮助?:)
编辑..显然,当在类的方法内分配引用时,会添加神秘的调用.
如果我有这个课程:
private class Test { int _X; int _Y; Test _t; public void SetValues(int x, int y, Test t) { _X = x; _Y = y; } }
为方法SetValues生成的程序集是:
_X = x; 00000028 mov eax,dword ptr [ebp-3Ch] 0000002b mov edx,dword ptr [ebp-40h] 0000002e mov dword ptr [eax+8],edx _Y = y; 00000031 mov eax,dword ptr [ebp-3Ch] 00000034 mov edx,dword ptr [ebp+0Ch] 00000037 mov dword ptr [eax+0Ch],edx
这是有道理的
但是,如果我写这个
private class Test { int _X; int _Y; Test _t; public void SetValues(int x, int y, Test t) { _X = x; _Y = y; _t = t; } }
神秘的电话出现了
_X = x; 00000028 mov eax,dword ptr [ebp-3Ch] 0000002b mov edx,dword ptr [ebp-40h] 0000002e mov dword ptr [eax+8],edx _Y = y; 00000031 mov eax,dword ptr [ebp-3Ch] 00000034 mov edx,dword ptr [ebp+0Ch] 00000037 mov dword ptr [eax+0Ch],edx _t = t; 0000003a mov edx,dword ptr [ebp-3Ch] 0000003d mov eax,dword ptr [ebp+8] 00000040 lea edx,[edx+4] 00000043 call 515E2E48
恕我直言,它与垃圾收集有关,但我无法理解它是什么,我真的想弄明白.我知道有人必须知道:)
答案的附录,这是我通过C#从书籍CLR中获取的摘录: