Идентичность статической встроенной функции?
-
14-11-2019 - |
Вопрос
Имеет ли статическая встроенная функция C идентичность во время выполнения?
Должен ли я заботиться о конфликте имен этих конструкций?
Если функция определена в .c
файл?Это то же самое?
Решение
Имеет ли статическая встроенная функция C идентичность во время выполнения?
Статическая встроенная функция имеет идентичность внутри единицы компиляции, если компилятор хотя бы один раз решит не встраивать ее или если вы берете адрес функции.
Взятый адрес действителен только в текущей единице компиляции (.c
файл).В другом модуле компиляции (другом .c
файл), компилятор предоставит вам другой адрес.
Как и в случае любой другой функции с телом, видимым компилятору, код функции может быть полностью или частично реплицирован в различных местах ассемблерного кода, сгенерированного компилятором.
Статическая встроенная функция (как и любая статическая функция) не видна ни из какой другой .c
файл, чем текущий скомпилированный .c
файл.
Должен ли я заботиться о конфликте имен этих конструкций?
Только если вы возьмете адрес статической встроенной функции, определенной в заголовочном файле, и сделаете следующее:
- Статическая встроенная функция
f
определяется в файлеa.h
a.h
включен в файлы Cx.c
иy.c
x.c
берет адресf
и сохраняет его в глобальную переменнуюf_addr
y.c
берет адресf
и сравнивает его на предмет идентичности со значением, хранящимся вf_addr
- Результатом сравнения будет
false
, несмотря на то, что на другой уровень абстракции это та самая функцияf
Если функция определена в файле .c?Это то же самое?
С точки зрения компилятора C, это то же самое, что определение функции в файле заголовка и включение файла заголовка в файл .c.Компилятор понятия не имеет о файлах заголовков, он видит только одну единицу непрерывной компиляции.Заголовочный файл — это концепция, существующая в сознании программистов, использующих язык C, но с точки зрения компилятора C эта концепция не существует.
Другие советы
Именование встроенной функции так же важно, как и имя невстроенной функции.Имя используется компилятор чтобы определить, какую функцию вызывать.Его также используют программисты, читающие код, чтобы понять, что делает функция.
Во время выполнения имя функции не имеет значения.
Также обратите внимание, что inline
ключевое слово — это всего лишь намекать компилятору.Функция на самом деле может быть не встроена, несмотря на inline
ключевое слово.Аналогично, функция, которая не помечена как inline
может все еще быть встроен компилятором.
Возможно, вас не волнуют конфликты имен встроенных функций, но я гарантирую, что компилятор это сделает!
Встраивание — это операция на более позднем этапе компиляции: сначала компилятору необходимо определить структуру вызовов вашей программы, что требует от компилятора правильного разрешения всех именованных вызовов.
Во время выполнения вы не можете узнать имя какой-либо выполняющейся в данный момент функции без явного кодирования какой-то магии для ее определения - c
не является отражающий.
Как отмечает Марк, ключевое слово inline — это всего лишь подсказка: компилятор может игнорировать его, если решит, что явный вызов обеспечит лучшую производительность.