Здравствуйте, CRT, Вы писали:
CRT> CRT>> как компилятор может сначала вызвать b() перед a()?
CRT> CRT>> у меня это в голове не укладывается. Такого быть не должно.
CRT> ·>Может, естественно, если компилятор знает, что это не влияет на наблюдаемое поведение.
CRT> чтобы это знать, компилятор должен учитывать всё что делается внутри a() и b() и так же внутри тех функций которые эти a() и b() в свою очередь вызывают и далее по цепочке. Что-то я сомневаюсь что компилятор копает так глубоко. Хотя кто их знает...
Ну во-первых, а кто сказал, что a() и b() это обязано быть чем-то глубоким.
А во-вторых, это работа такая у оптимизатора компилятора, стараться копать поглубже.
CRT> ·>Другое дело, что в начальном примере был запуск треда, который вроде как по современным стандартам (The memory model was then included in the next C++ and C standards, C++11 and C11) должен создавать барьер.
CRT> это я знаю.
CRT> вообще автор задал вопрос неоднозначно
Ну да... Тонкости в формулировке правильного вопроса есть.
CRT> Короче, однозначно что tool будет проинициализирован перед запуском потока.
+1.
Интересно как оно работало в старых версиях языка... Полагаю это было на уровне OS API.