我有一些代碼,非常類似於大致如下:這個調用來自哪裏?
class C {
string s;
static C a = new C();
static void Main() {
C b = a;
b.s = "hello";
}
的Main
方法的拆卸,在Release模式,如下:
C b = a;
00000000 push ebp
00000001 mov ebp,esp
00000003 push eax
00000004 cmp dword ptr ds:[04581D9Ch],0
0000000b je 00000012
0000000d call 763B3BC3
00000012 xor edx,edx
00000014 mov dword ptr [ebp-4],edx
00000017 mov eax,dword ptr ds:[01B24E20h] ; Everything up to this point
0000001c mov dword ptr [ebp-4],eax ; is fairly clear.
b.s = "hello";
0000001f mov eax,dword ptr ds:[01B22088h] ; Loads the address of "hello"
00000025 mov ecx,dword ptr [ebp-4] ; Loads the address of b
00000028 lea edx,[ecx+4] ; Loads the address of (the reference to?) b.s
0000002b call 76100AE0 ; ??
}
00000030 nop
00000031 mov esp,ebp
00000033 pop ebp
00000034 ret
我不明白爲什麼通話在NB是必要的。它似乎是b.s
和s
的地址作爲參數傳遞,但由於這是一個簡單的指針分配,爲什麼這是必要的?
(這種情況似乎發生了很多任務的指針。然而,分配null
似乎並沒有遵循這個模式。)
看起來像是正確的解釋。 MSDN調用該(方法)一個寫屏障。 – 2012-03-19 23:06:03
@HenkHolterman,你能提供一個鏈接嗎? – svick 2012-03-20 13:20:58
[垃圾收集器基礎和性能提示](http://msdn.microsoft.com/zh-cn/library/ms973837.aspx),頁面下半部分 – 2012-03-20 15:53:27