#c #multithreading #inline
#c #многопоточность #встроенный
Вопрос:
Я хочу выяснить поведение компиляторов C , когда функция включает манипуляции с потоками и помечена как встроенная.
Например, это метод-член класса. :
inline Vec3 Pos() {
unique_lock lock(mutex_);
return pos_;
}
Если он вызывается некоторыми клиентскими кодами, будет ли компилятор вставлять коды (т. Е. Разворачивать коды)? Если да, то какова развернутая версия? Не охваченный или ограниченный?
Ответ №1:
В машинном коде нет ничего подобного «области видимости». «область видимости» — это концепция языка, которая определяет время жизни переменных.
Теперь в C / C существует «КАК ЕСЛИ БЫ правило», означающее, что компилятор имеет право выполнять любые преобразования кода, пока все его видимые результаты остаются неизменными. Таким образом, эффекты «области видимости» должны оставаться неизменными.
В прошлом inline
ключевое слово означало «убедитесь, что этот код вставлен в код вызывающего абонента». В настоящее время это означает «не сообщать об ошибке, если вы обнаружите переопределение этой функции». Компилятор может вставить этот код функции в код вызывающих, но это не обязательно.