c ++ 11 — Является ли динамическая загрузка строго совместимой со стандартом C ++?

Требует ли использование динамической загрузки каких-либо особых мер предосторожности для того, чтобы код был строго легальным для C ++?

Стандарт C ++ 11 относится к порядку определенных событий, таких как то, что происходит перед первым вызовом main (). Тем не менее, динамическая загрузка, кажется, вытаскивает коврик из-под типичных предположений относительно порядка событий в программе.

В качестве примера приведена цитата из п. 3.6.2.

Статическая инициализация должна быть выполнена до любой динамической инициализации.

В случае динамической загрузки это кажется почти невозможным обязательством, если воспринимать его буквально. Программа может подвергаться динамической инициализации, а затем динамически загружать код. Если этот код содержит переменные, которые обычно были бы статически инициализированы, стандарт C ++ был нарушен. Представляется возможным, что порядок событий, предписанный Стандартом, все еще может казаться удовлетворенным и законным по правилу «как будто», но в других местах SO другие предупреждают о слишком широком толковании этого правила.

3

Решение

Стандарт C ++ не содержит каких-либо положений для динамических модулей, поэтому необходим определенный объем интерпретации.

Да, статически-инициализированные переменные в динамически загружаемых модулях будут инициализироваться после динамически инициализированных переменных в главном модуле. Вы можете наблюдать это и создавать программы там, где это влияет на поведение программы. Но если вы рассматриваете DLL как отдельную программу, которая разделяет пространство памяти основной программы, но имеет собственную временную шкалу, вы можете в значительной степени применять те же правила на уровне модуля и использовать их для прогнозирования поведения на уровне приложения. поведение. Компилятор не хочу удивить тебя … это просто иногда нужно.

Кстати, порядок инициализации действительно меньше всего беспокоит вас, когда дело доходит до коллизии между C ++ и DLL. Динамические модули нарушают гораздо больше правил, особенно когда речь идет о RTTI.

3

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector