Информация об изменениях

Сообщение Re: Что раньше - загрузка статической библиотеки или инициал от 27.08.2024 13:30

Изменено 27.08.2024 13:32 Chorkov

Re: Что раньше - загрузка статической библиотеки или инициализация переменной?
Здравствуйте, Molchalnik, Вы писали:

M>Коллеги!


M>Такой вопрос.

M>Статическая переменная при инициализации вызывает функцию из статической библиотеки. пусть то будет хоть переменная в функции (например, синглтон) или глобальная переменная, или статический член класса.
M>Гарантирует ли стандарт C++, что статическая библиотека загрузится раньше, чем начнётся инициализация статической переменной в главном модуле?

M>На практике я сталивался с тем, что либа может жагружатся позже. Но было давно, поэтому это не точно — мог забыть и перепутать от времени.

M>К тому же, это может быть особенностью компилятора, а не требованием стандарта.

С точки зрения стандарта, статическая либа — это набор единиц трансляции, равноправных с исходниками текущей программы.
Т.е. сперва инициализируются constant initialization (во всех единицах трансляции, включая либы), и потом конструкторы глобальных пременных и инициализация переменных не-константами (т.е. там, где надо исполнять код для вычисления значений).

В принципе, можно написать написать либу так, что вызов функции на этапе инициализации статических переменных вызовет UB, но это ИМХО саботаж.

С другой стороны, многие либы требуют, чтобы до использования была вызвана специальная функция для настройки работы либы (выбор аллокатора памяти, уровня логгирования, использования палатализации, и т.д.). Для таких либ, вызов их функций на этапе инициализации, тоже (ИМХО) саботаж.
Re: Что раньше - загрузка статической библиотеки или инициал
Здравствуйте, Molchalnik, Вы писали:

M>Коллеги!


M>Такой вопрос.

M>Статическая переменная при инициализации вызывает функцию из статической библиотеки. пусть то будет хоть переменная в функции (например, синглтон) или глобальная переменная, или статический член класса.
M>Гарантирует ли стандарт C++, что статическая библиотека загрузится раньше, чем начнётся инициализация статической переменной в главном модуле?

M>На практике я сталивался с тем, что либа может жагружатся позже. Но было давно, поэтому это не точно — мог забыть и перепутать от времени.

M>К тому же, это может быть особенностью компилятора, а не требованием стандарта.

С точки зрения стандарта, статическая либа — это набор единиц трансляции, равноправных (по порядку выполнения инициализации) с исходниками текущей программы.
Т.е. сперва инициализируются constant initialization (во всех единицах трансляции, включая либы), и потом конструкторы глобальных пременных и инициализация переменных не-константами (т.е. там, где надо исполнять код для вычисления значений).

В принципе, можно написать написать либу так, что вызов функции на этапе инициализации статических переменных вызовет UB, но это ИМХО саботаж.

С другой стороны, многие либы требуют, чтобы до использования была вызвана специальная функция для настройки работы либы (выбор аллокатора памяти, уровня логгирования, использования палатализации, и т.д.). Для таких либ, вызов их функций на этапе инициализации, тоже (ИМХО) саботаж.