Запрос подробного описания Static Initialization Order Fiasco

Я читал о SIOF в faq-lite и до сих пор не понимаю, почему возникает проблема. У меня есть статическая библиотека (.a), и я использую эту библиотеку для использования ее статического типа объекта-члена данных const. Затем этот статический тип объекта-члена данных const я использую и назначаю глобальной переменной (объекту). Но кажется, что глобальная переменная пуста, когда я использую эту глобальную переменную для своей основной или любой локальной функции. Я, очевидно, знаю, что моя проблема - SIOF, но я действительно не понимаю, почему мой статический объект-член данных const не был инициализирован.

Это была статическая библиотека, поэтому я предполагаю, что когда мы создали нашу статическую библиотеку, статический объект-член данных const был скомпилирован и связан с этой статической библиотекой, поправьте меня, если я ошибаюсь.

//libsource.h
class foo
{
   public:
   ....

   public:
   static const barbar foofaa;
};

//libsource.cpp
const barbar foo::foofaa = barbar();

//main.cpp
#include <libsource.h>

barbar foos= foo::foofaa;

int main()
{
   //can't use foos because its empty
}

Пожалуйста посоветуй. Почему этот статический объект-член данных const не был инициализирован, даже если он находится в статической библиотеке?

Большое спасибо.


person domlao    schedule 19.01.2011    source источник


Ответы (1)


Фиаско статического порядка инициализации довольно прямолинейно: статические объекты в одной единице перевода инициализируются в том порядке, в котором они объявлены, но нет никакой гарантии относительно порядка, в котором инициализируются статические объекты в разных единицах перевода относительно каждого Другие.

Итак, в вашем конкретном примере foos в main.cpp может быть инициализирован до foo::foofaa, объявленного в libsource.cpp.

person James McNellis    schedule 19.01.2011
comment
Привет спасибо. Это действительно размыто для меня в части инициализации. Почему ему нужно инициализировать статический элемент данных? Он уже инициализирован, когда мы скомпилировали и скомпоновали для создания статической библиотеки? Пожалуйста посоветуй. Спасибо - person domlao; 19.01.2011
comment
@sasayins: статические переменные не инициализируются, пока вы не запустите свою программу. Они не сидят предварительно инициализированными в вашей статической библиотеке, ожидая использования. Поэтому, когда ваша программа запускается (до вызова main()), она инициализирует все статические переменные в каждой библиотеке. - person JaredC; 19.01.2011
comment
@JaredC: точнее, некоторые статические переменные предварительно инициализируются во время компиляции или компоновки, но другие (нетривиальные) часто требуют инициализации во время выполнения. Компилятор обычно создает функцию инициализации для каждого объекта, который он создает, затем все они вызываются перед запуском main(), но проблема в том, что порядок, в котором вызываются эти функции инициализации, может не соответствовать вашей программе. Действительно, если у вас есть циклические зависимости, то может быть неважно, что запустится первым — оно все равно сломается. Облегченный FAQ продолжается с некоторыми обходными путями.... - person Tony Delroy; 19.01.2011