Примечание. Здесь нет многопоточности. Просто оптимизированный однопоточный код.
Функциональный вызов представляет точку последовательности. (Очевидно.)
Из этого следует, что компилятор (если оптимизатор встроен в функцию) не может перемещать/смешивать любые инструкции до/после с помощью инструкций функции? (Пока он не может "пропустить" никаких видимых эффектов, очевидно.)
Пояснительная предпосылка:
Теперь есть хорошая статья. класс сравнения для С++, где автор заявил:
Код, который мы не будем переустанавливать оптимизатором, всегда будет между этими вызовами start/end теперь(), поэтому мы можем гарантировать время будет действительным.
на который я спросил, как он может быть уверен, и nick ответил:
Вы можете проверить комментарий в этом ответе https://codereview.stackexchange.com/a/48884. Я цитирую: "Я бы внимательно следите за временем, которое не работает из-за оптимизация, которую разрешает компилятор. Я не уверен в требования к последовательности и понимание наблюдаемого поведения такой программы. При вызове функции компилятору не разрешается перемещать инструкции по точке вызова (они секвенированы до или после вызова).
Что мы делаем, это в основном абстрактное вызываемое (функция, лямбда, блок кода, окруженного лямбдой) и имеют вызов для подписки
callable(factor)
внутри структурыmeasure
, которая действует как барьер (а не барьер в многопоточности, я полагаю, сообщение).
Я совершенно не уверен в этом, особенно цитата:
При вызове функции компилятору не разрешается перемещать инструкции по точке вызова (они секвенированы до или после вызова).
Теперь у меня всегда создалось впечатление, что когда оптимизатор строит некоторую функцию (что вполне может быть в случае (простого) эталонного сценария), она может свободно перестраивать все, что угодно, пока это не влияет наблюдаемое поведение.
То есть, что касается языка/оптимизатора, эти два фрагмента абсолютно одинаковы:
void f() {
// do stuff / Multiple statements
}
auto start = ...;
f();
auto stop = ...;
против.
auto start = ...;
// do stuff / Multiple statements
auto stop = ...;