Здравствуйте, KPavel, Вы писали:

K> Определяется ли порядок разрушения статических и глобальных объектов

K> порядком инициализации? Если да, то как — LIFO?

Именно так. При этом, гарантируется, что разрушение будет происходить именно в таком порядке,
независимо от того, в каких единицах трансляции определены объекты.

K> Когда происходит инициализация статического объекта, определенного в функции -

K> при первом вызове функции, или в порядке общей очереди при инициализации глобальных
K> объектов и статических членов-объектов классов?

Ответ на этот вопрос зависит от того, что за объект и как именно он проинициализирован. Сначала, до любой
другой инициализации, производится инициализация нулями. Инициализация объектов POD-типа (например, int),
проиинициализировнных константными выражениями, выполняется до того, как управление попадает в блок, где
они определены. Точный момент не известен, но это и не нужно. Остальные объекты, если реализация может
инициализировать их статически, могут инициализироваться по правилам инициализации объектов, определенных
вне функций (namespace scope). Фактически, статическая инициализация обычно означает заполнение
соответствующего сегмента данных соответствующими значениями еще при загрузке программы. Прочие объекты,
например, инициализирующиеся вызовом функции или конструктором, должны быть проинициализированы не просто
при первом вызове, а именно в момент, когда управление проходит через точку, в которой определен искомый
объект. Например:

struct C {
  C();
  ~C();
};

void f(int i)
{
  if (i < 1)
    return;

  static C c1;

  if (i < 2)
    return;

  static C c2;
}

int main()
{
  f(0);
  f(1);
  f(2);
}


Если инициализация c1 и c2 не будет заменена на статическую (а скорее всего, не будет, т.к. определение
C::C() находится в другой единице трансляции), то при вызове f(0) не будет проинициализирован ни c1, ни
с2. При вызове f(1) будет проинициализирован только c1. При вызове f(2) — только c2, т.к. c1 уже
проинициализирован ранее.

K> Различает ли стандарт глобальные переменные/статические члены/статические переменные функций при инициализации и разрушении?


Как видишь, объекты со статическим временем жизни, определенные в функциях, различает Глобальные
переменные и статические члены классов в этом отношении не различаются.
Posted via RSDN NNTP Server 1.6 RC1
Автор: Павел Кузнецов    Оценить