Документация для атрибута constructor
гласит:
Однако в настоящее время порядок, в котором конструкторы для объектов C ++ со статической продолжительностью хранения и функций украшеныатрибут constructor
вызывается не определено.
Это означает, что конструкторы ELF и статические объекты (например, используемые для инициализации std::cout
) плохо смешиваются.
Вкл.С другой стороны, std::cout
является историческим исключением, поскольку не полагается на конструктор в стандартной библиотеке C ++.В системах ELF конструкторы ELF работают в топологическом порядке.Это означает, что динамический компоновщик просматривает библиотечные зависимости (записи DT_NEEDED
) и задерживает инициализацию библиотек до инициализации их зависимостей.
В результате код C ++ может предполагать, что библиотека времени выполнения C ++полностью инициализируется при запуске конструкторов ELF и создании глобальных объектов, определенных приложением.Единственным исключением является библиотека C ++, которая выгружает подпрограммы, используемые самой стандартной стандартной библиотекой C ++ (посредством взаимного расположения символов ELF), и если между библиотеками существуют циклические зависимости, так что нет правильного порядка инициализации.Оба случая не являются общими, и если вы не напишите пользовательский malloc
или что-то в этом роде, этого можно избежать при правильном дизайне приложения.