Является ли динамическая загрузка строго совместимой со стандартом C++?
Требует ли использование динамической загрузки каких-либо особых мер предосторожности для того, чтобы код был строго легальным для C++?
Стандарт C++11 относится к порядку определенных событий, таких как то, что происходит перед первым вызовом main(). Тем не менее, динамическая загрузка, кажется, вытаскивает коврик из-под типичных предположений относительно порядка событий в программе.
В качестве примера приведена цитата из п. 3.6.2.
Статическая инициализация должна быть выполнена до любой динамической инициализации.
В случае динамической загрузки это кажется почти невозможным обязательством, если воспринимать его буквально. Программа может подвергаться динамической инициализации, а затем динамически загружать код. Если этот код содержит переменные, которые обычно были бы статически инициализированы, стандарт C++ был нарушен. Представляется возможным, что порядок событий, предписанный Стандартом, может казаться удовлетворенным и законным по правилу "как будто", но в других местах SO другие предупреждают о слишком широком толковании этого правила.
1 ответ
Стандарт C++ не содержит каких-либо положений для динамических модулей, поэтому необходим определенный объем интерпретации.
Да, статически-инициализированные переменные в динамически загружаемых модулях будут инициализироваться после динамически инициализированных переменных в главном модуле. Вы можете наблюдать это и создавать программы там, где это влияет на поведение программы. Но если вы рассматриваете DLL как отдельную программу, которая разделяет пространство памяти основной программы, но имеет собственную временную шкалу, вы можете в значительной степени применять те же правила на уровне модуля и использовать их для прогнозирования поведения на уровне приложения. поведение. Компилятор не хочет вас удивлять... это иногда случается.
Кстати, порядок инициализации действительно меньше всего беспокоит вас, когда дело доходит до коллизии между C++ и DLL. Динамические модули нарушают гораздо больше правил, особенно когда речь идет о RTTI.