Будет ли компилятор вставлять коды, если коды включают манипуляции с потоками?

#c #multithreading #inline

#c #многопоточность #встроенный

Вопрос:

Я хочу выяснить поведение компиляторов C , когда функция включает манипуляции с потоками и помечена как встроенная.

Например, это метод-член класса. :

   inline Vec3 Pos() {
    unique_lock lock(mutex_);
    return pos_;
  } 
  

Если он вызывается некоторыми клиентскими кодами, будет ли компилятор вставлять коды (т. Е. Разворачивать коды)? Если да, то какова развернутая версия? Не охваченный или ограниченный?

Ответ №1:

В машинном коде нет ничего подобного «области видимости». «область видимости» — это концепция языка, которая определяет время жизни переменных.

Теперь в C / C существует «КАК ЕСЛИ БЫ правило», означающее, что компилятор имеет право выполнять любые преобразования кода, пока все его видимые результаты остаются неизменными. Таким образом, эффекты «области видимости» должны оставаться неизменными.

В прошлом inline ключевое слово означало «убедитесь, что этот код вставлен в код вызывающего абонента». В настоящее время это означает «не сообщать об ошибке, если вы обнаружите переопределение этой функции». Компилятор может вставить этот код функции в код вызывающих, но это не обязательно.