Как именно выполняются вызовы Destructor - PullRequest
0 голосов
/ 27 апреля 2018

Интересно, как именно вызывается конструктор или деструктор, например, в c ++? Меня особенно интересует точка зрения ОС. Мне также интересен случай, когда мы запускаем приложение для Android, написанное на Java, и мы хотим получить информацию о сеансе пользователя. Можем ли мы использовать conatructor для установки времени начала сессии и destr для установки времени окончания сессии и сохранения данных в базе данных? На самом ли деле ОС обрабатывает вызовы деструкторов или что-то еще? Заранее спасибо!

1 Ответ

0 голосов
/ 30 апреля 2018

Я не знаком с тем, как Java обрабатывает конструктор и деструктор (Java включает в себя уровень виртуальной машины), но я постараюсь ответить на это с точки зрения cpp.

Краткий ответ на ваш вопрос: ОС не участвует в конструкторе или деструкторе (если нет выделения кучи, системного вызова ...). Компилятор вставит вызовы конструктора и деструктора в нужное место, когда он генерирует машинный код.

Для простой программы:

class A{

    int* i;
public:
    A() { i = new int; }
    ~A() { delete i; }
};

int main() {
    A a;
}

Давайте рассмотрим код сборки, выдаваемый компилятором, используя objdump:

00000000004006a6 <main>:
  4006a6:       55                      push   %rbp
  4006a7:       48 89 e5                mov    %rsp,%rbp
  4006aa:       48 83 ec 10             sub    $0x10,%rsp
  4006ae:       64 48 8b 04 25 28 00    mov    %fs:0x28,%rax
  4006b5:       00 00 
  4006b7:       48 89 45 f8             mov    %rax,-0x8(%rbp)
  4006bb:       31 c0                   xor    %eax,%eax
  4006bd:       48 8d 45 f0             lea    -0x10(%rbp),%rax
  4006c1:       48 89 c7                mov    %rax,%rdi
  4006c4:       e8 27 00 00 00          callq  4006f0 <_ZN1AC1Ev>
  4006c9:       48 8d 45 f0             lea    -0x10(%rbp),%rax
  4006cd:       48 89 c7                mov    %rax,%rdi
  4006d0:       e8 3f 00 00 00          callq  400714 <_ZN1AD1Ev>
  4006d5:       b8 00 00 00 00          mov    $0x0,%eax
  4006da:       48 8b 55 f8             mov    -0x8(%rbp),%rdx
  4006de:       64 48 33 14 25 28 00    xor    %fs:0x28,%rdx
  4006e5:       00 00 
  4006e7:       74 05                   je     4006ee <main+0x48>
  4006e9:       e8 92 fe ff ff          callq  400580 <__stack_chk_fail@plt>
  4006ee:       c9                      leaveq 
  4006ef:       c3                      retq

Обратите внимание, что в зависимости от базовой архитектуры и компилятора ваши выходные данные могут не совпадать с моими, но структура, как правило, должна быть такой же.

Вы можете видеть, что компилятор автоматически генерирует вызовы для конструктора callq 400714 <_ZN1AD1Ev> и деструктора callq 400714 <_ZN1AD1Ev>. Код сборки для конструктора:

00000000004006f0 <_ZN1AC1Ev>:
  4006f0:       55                      push   %rbp
  4006f1:       48 89 e5                mov    %rsp,%rbp
  4006f4:       48 83 ec 10             sub    $0x10,%rsp
  4006f8:       48 89 7d f8             mov    %rdi,-0x8(%rbp)
  4006fc:       bf 04 00 00 00          mov    $0x4,%edi
  400701:       e8 8a fe ff ff          callq  400590 <_Znwm@plt>
  400706:       48 89 c2                mov    %rax,%rdx
  400709:       48 8b 45 f8             mov    -0x8(%rbp),%rax
  40070d:       48 89 10                mov    %rdx,(%rax)
  400710:       90                      nop
  400711:       c9                      leaveq 
  400712:       c3                      retq   
  400713:       90                      nop

Сборка для деструктора:

0000000000400714 <_ZN1AD1Ev>:
  400714:       55                      push   %rbp
  400715:       48 89 e5                mov    %rsp,%rbp
  400718:       48 83 ec 10             sub    $0x10,%rsp
  40071c:       48 89 7d f8             mov    %rdi,-0x8(%rbp)
  400720:       48 8b 45 f8             mov    -0x8(%rbp),%rax
  400724:       48 8b 00                mov    (%rax),%rax
  400727:       48 89 c7                mov    %rax,%rdi
  40072a:       e8 31 fe ff ff          callq  400560 <_ZdlPv@plt>
  40072f:       90                      nop
  400730:       c9                      leaveq 
  400731:       c3                      retq   
  400732:       66 2e 0f 1f 84 00 00    nopw   %cs:0x0(%rax,%rax,1)
  400739:       00 00 00 
  40073c:       0f 1f 40 00             nopl   0x0(%rax)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...