Автоматическое уничтожение объекта - PullRequest
3 голосов
/ 29 августа 2011

Гарантируется ли уничтожение автоматических объектов (объектов, созданных в стеке) не раньше, чем они выйдут из области видимости?

Для уточнения:

#include <iostream>

class A {
  public:
    A() {
      std::cout << "1";
    }
    ~A() {
      std::cout << "3";
    }
};

void test123() {
  A a;
  std::cout << "2";
}

Для печати "2", a больше не требуется, поэтому теоретически компилятор может попытаться оптимизировать и уничтожить a, как только он больше не нужен.

Могу ли я рассчитывать на вышеуказанную функцию всегда печать 123?

Ответы [ 3 ]

9 голосов
/ 29 августа 2011

Порядок уничтожения стековых объектов строго определен - они выполняются в порядке, обратном объявлению, когда вы покидаете область действия (либо выполняя конец {}, либо return, либо исключением) , Итак, вы будете всегда видеть 123 там.

Обратите внимание, однако, что оптимизации компилятора регулируются правилом «как будто». Другими словами, компилятор может уничтожить объект на ранней стадии, если результирующая программа ведет себя так, как если бы она была уничтожена в обычное время. В этом случае, поскольку вы делаете вывод, компилятор должен запланировать вывод в нужное время. Однако, если у вас есть, например, delete d указатель на примитивный тип, и компилятор может доказать, что нет других выдающихся указателей на это значение, он в принципе мог бы переместить этот delete раньше. Ключ в том, что ни одна соответствующая программа не способна заметить эту оптимизацию.

3 голосов
/ 29 августа 2011

Стандарт определяет, что правильным поведением для этого кода является печать «123».Компиляторам разрешено изменять код столько раз, сколько они хотят, при сохранении той же семантики ( as-if rule), а переупорядочение кода здесь изменит семантику, поэтому совместимый компилятор не может делатьэто.

0 голосов
/ 29 августа 2011

У конструкторов могут быть побочные эффекты. Например, они могут реализовать мьютекс, то есть конструктор блокирует, а десктуктор разблокирует мьютекс. Следовательно, требуется 123.

...