Откуда этот звонок? - PullRequest
       16

Откуда этот звонок?

0 голосов
/ 20 марта 2012

У меня есть некоторый код, очень похожий на следующий:

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 

Iне понимаю, зачем нужен звонок на нб.Кажется, что адреса b.s и s передаются в качестве аргументов, но так как это простое присвоение указателя, почему это необходимо?

(Такое поведение, по-видимому, происходит для многих назначенийуказателям. Однако присвоение null, похоже, не следует этому шаблону.)

Ответы [ 2 ]

5 голосов
/ 20 марта 2012

Угадайте: это немного устанавливает таблицу карт GC, потому что вы создаете новую ссылку из поля кучи на объект кучи.

Вы сказали: «Такое поведение, кажется, происходит для многих назначенийуказатели».Это идеально подходит для этого объяснения.

0 голосов
/ 20 марта 2012

Если это string в примере является std::string, то ваше невинно выглядящее задание выглядит следующим образом:

mov  eax, offset "hello"
mov  ecx, b
lea  edx, [ecx+4] ; edx = &b.s
call std::string::operator=(const char *)

(Кажется, что эта конкретная компиляция ожидает "this" в edxи аргумент в eax - вероятно, результат оптимизации всей программы - традиционное соглашение - this в ecx и других аргументах в стеке.)

C ++ и STL обеспечивают удобное и в основном простое управление памятью.Но это не бесплатно.Это определенно не «простое назначение указателя», независимо от того, как оно выглядит в исходном коде.

...