Идентичность статической встроенной функции? - PullRequest
2 голосов
/ 01 марта 2012

Имеет ли статическая встроенная функция C идентичность во время выполнения?

Стоит ли беспокоиться о конфликте имен этих конструкций?

Если функция определена в файле .c?Это то же самое?

Ответы [ 3 ]

2 голосов
/ 01 марта 2012

Наименование встроенной функции так же важно, как и наименование не встроенной функции.Имя используется компилятором , чтобы определить, какую функцию вызывать.Он также используется программистами, читающими код, чтобы понять, что делает функция.

Во время выполнения имя функции не имеет значения.

Также обратите внимание, что ключевое слово inline является только подсказка к компилятору.Функция может быть не встроенной, несмотря на ключевое слово inline.Аналогично, функция, которая не помечена как inline, может все еще быть встроенной компилятором.

1 голос
/ 01 марта 2012

Имеет ли статическая встроенная функция C идентичность во время выполнения?

Статическая встроенная функция имеет идентичность в модуле компиляции, если компилятор хотя бы один раз решил не вставлять ее в строку или если вы используетеадрес функции.

Полученный адрес действителен только в текущем модуле компиляции (файл .c).В другом модуле компиляции (другом файле .c) компилятор даст вам другой адрес.

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

Статическая встроенная функция (как любая статическая функция) не видна ни в каком другом файле .c, кроме скомпилированного в данный момент .c файла.

Должен ли я беспокоиться о конфликте имен этих конструкций?

Только если вы берете адрес статической встроенной функции, определенной в заголовочном файле, и делаете следующее:

  1. Статическая встроенная функция f определена в файле a.h
  2. a.h включена в файлы C x.c и y.c
  3. x.c дублейадрес f и сохраняет его в глобальной переменной f_addr
  4. y.c берет адрес f и сравнивает его для идентификации со значением, хранящимся в f_addr
  5. ТамРезультатом сравнения будет false, несмотря на то, что на другом уровне абстракции это та же самая функция f

Если функцияопределяется в .c файле?Это то же самое?

С точки зрения компилятора C, это то же самое, что определение функции в заголовочном файле и включение заголовочного файла в файл .c.Компилятор не имеет представления о заголовочных файлах, он видит только один модуль непрерывной компиляции.Заголовочный файл - это концепция, которая существует в умах программистов, использующих язык C - эта концепция не существует с точки зрения компилятора C.

1 голос
/ 01 марта 2012

Возможно, вас не волнуют конфликты имен встроенных функций, но я гарантирую, что компилятор будет!

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

Во время выполнения вы не можете знать имя любой выполняемой в данный момент функции без явного кодирования некоторой магии для ее определения - c не является отражающим .

Как отмечает Марк, ключевое слово inline является лишь подсказкой - компилятор может игнорировать его, если решит, что при явном вызове достигается лучшая производительность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...