разборка конструктора класса - PullRequest
3 голосов
/ 27 июня 2011

Существует небольшой раздел разборки после вызова конструктора, который не имеет никакого смысла. Вот оно,

.text:011A18F0 loc_11A18F0:                            ; CODE XREF: main+5Bj
.text:011A18F0                 mov     [ebp+again_obj], 0
.text:011A18FA
.text:011A18FA loc_11A18FA:                            ; CODE XREF: main+6Ej
.text:011A18FA                 mov     eax, [ebp+again_obj]
.text:011A1900                 mov     [ebp+var_104], eax
.text:011A1906                 mov     [ebp+var_4], 0FFFFFFFFh
.text:011A190D                 mov     ecx, [ebp+var_104]
.text:011A1913                 mov     [ebp+var_14], ecx
.text:011A1916                 mov     eax, [ebp+var_14]
.text:011A1919                 mov     [ebp+var_E0], eax
.text:011A191F                 mov     ecx, [ebp+var_E0]
.text:011A1925                 mov     [ebp+var_EC], ecx
.text:011A192B                 cmp     [ebp+var_EC], 0
.text:011A1932                 jz      short loc_11A1949

Я не понимаю, почему 0FFFFFFFFh перемещен в var_4, и почему многие значения перемещаются в переменные и из них, как это делается здесь. Оптимизация была отменена, и я скомпилировал исходный код на платформе VS2010.

1 Ответ

5 голосов
/ 27 июня 2011

var_4 - это внутренняя переменная (я назову ее '_state'), которая отслеживает состояние созданных объектов для раскручивания в случае возникновения исключения. То, что вы видите, является общим шаблоном, созданным VC ++ при работе с новыми объектами. Э.Г.

 A* pA1 = new A();

преобразуется во что-то вроде этого:

_state = -1;
...
A *temp_pA1 = operator new(sizeof(A));
_state = 0;
if ( temp_pA1 != NULL ) 
{
   pA1 = A::A(temp_pA1);
}
else
{
   pA1 = NULL;
}
_state = -1;
...
[unwind funclet for state == 0]
{
  A::~A(temp_pA1);
}

Как видите, ему присваивается какое-то значение (например, 0) после того, как блок памяти для объекта является новым, но объект еще не создан. Таким образом, если в конструкторе происходит исключение, обработчик исключения автоматически освободит выделенную память. После построения он установлен в -1, что примерно соответствует «автоматическому выполнению, теперь все управление памятью находится в руках программиста».

См. здесь для получения более подробной информации («Реализация модели исключений C ++» и «Пример программы с исключениями C ++»).

...