У меня есть некоторый код, который очень грубо напоминал следующее:Откуда этот звонок?
class C {
string s;
static C a = new C();
static void Main() {
C b = a;
b.s = "hello";
}
разборки метода Main
в режиме выпуска, выглядит следующим образом:
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 вызывает это (метод) барьер записи. –
@HenkHolterman, не могли бы вы предоставить ссылку? – svick
[Основы сборщика мусора и рекомендации по производительности] (http://msdn.microsoft.com/en-us/library/ms973837.aspx), на полпути вниз по странице –