Я прочитал несколько вопросов на сайте StackOverflow о инлайн
в C, но до сих пор не понятно.
статический встроенный недействительными Ф(недействительными) {}
не имеет никакой практической разницы с статической силы Ф(недействительными) {}`.Экстерн рядный недействительными Ф(ничтожным);
делать?Я так и не нашел применения инлайн
ключевое слово в моих программах на C, и когда я вижу этого сайта в других людей's код, это's почти всегда статический встроенный
, в котором я не вижу никакой разницы с просто "статический".
В C код можно оптимизировать двумя способами: Для размера кода и времени выполнения.
gcc.gnu.org говорит,
объявив встроенной функции, вы можете направить ССЗ звонить, что функция быстрее. Один из способов ССЗ можно достичь этого является интеграция, что функция's код в код для своих абонентов. Это делает выполнение быстрее путем устранения вызова функции накладных расходов; кроме того, если фактические аргументы являются постоянными, их значения могут допускать упрощений во время компиляции, так что не все встроенные функции's код должен быть включен. Влияние на размер кода менее предсказуемой; объектный код может быть больше или меньше с помощью функции подстановки, в зависимости от конкретного случая.
Так, он сообщает компилятору, чтобы построить функцию в код, где он используется с целью улучшения времени выполнения.
Если вы объявляете небольших функций, таких как установка/снятие флага или какой-нибудь тумблер, который неоднократно выступал, "встроенный", он может сделать большой разницы в производительности по времени, но за счет размера кода.
Вновь обратимся к gcc.gnu.org,
когда встроенная функция не статическая, то компилятор должен предположить, что могут быть звонки из других исходных файлов; так как глобальный символ может быть определен только один раз в любой программе, функции не должны быть определены в других файлах, поэтому звонки на него не могут быть интегрированы. Поэтому, нестатический встроенная функция всегда включена по себе в обычном порядке.
Опять же, gcc.gnu.org, говорит все это:
если вы укажете как линейно, так и extern в определении функции, то определение используется только для встраивания. Ни в коем случае не является функцией составлен самостоятельно, даже если вы обратитесь в его адрес явно. Такой адрес будет внешней ссылкой, как если бы ты объявил функцию, и не определил его.
Эта комбинация роликовых и extern почти эффект макро. Способ этот заключается в определение функции в заголовочный файл с этих слов, и поставить еще одну копию определения (отсутствуют встроенные и внешние) в файле библиотеки. Определение в заголовочный файл вызывает большинство вызовов функции, чтобы подставляться. Если используются функции остаются, они ссылаются на один экземпляр в библиотеке.
Подводя итог:
,
инлайн` определение действует только в текущей единице трансляции.Экстерн рядный недействительными Ф(ничтожным);
Так как класс для хранения Экстерн
, идентификатор имеет внешний переключатель и встроенное определение также обеспечивает внешнее определение.Примечание: когда я говорю о .файлы C
и .сек файлов в ответе на этот вопрос, я предполагаю, что вы выложили правильно свой код, т. е.
.файлы cвключают
.чфайлы. Различие состоит в том, что
.H-файл может быть включен в несколько единиц трансляции.
статический встроенный недействительными Ф(недействительными) {}
не имеет никакой практической разницы с статической силы Ф(недействительными) {}`.
В ИСО С, это правильно. Они идентичны в поведении (если вы не'т повторно объявить их на том же ту конечно по-разному!) единственным практическим результатом может быть причиной компилятору оптимизировать по-разному.
встроенные недействительными Ф(недействительными) {}
в C не't работа как C++ путь. Как это работает в C? Что на самом деле означает
Экстерн рядный недействительными Ф(ничтожным);` делать?
Это объясняется этот ответ, а также этот thread.
В стандарте ISO C и C++, вы можете свободно использовать встроенные Ф недействительным(недействительными) {}` в заголовочных файлах -- хотя и по разным причинам!
В стандарте ISO C, она не дает внешних определений. В стандарте ISO C++ - это не внешнее определение; однако в C++ есть еще одно правило (которое с не'т), что при наличии нескольких внешних определений встроенные функции, то компилятор разбирается и выбирает один из них.
Экстерн рядный недействительными Ф(ничтожным);
в .C файл в ISO C это предназначается, чтобы быть в паре с использованием встроенного недействительными Ф(недействительными) {}
в заголовочных файлах. Это вызывает внешние определения функции должны быть активированы в том, что единица перевода. Если вы Don'т сделать это, то нет никакого внешнего определения, и поэтому вы можете получить сообщение об ошибке ссылку (это является неуказанным ли какой-либо конкретной звонок Ф
ссылки на внешние определение или нет).
Другими словами, в стандарте ISO C вы можете вручную выбирать, где внешнее определение идет; или подавлять внешнее определение полностью с помощью статический встроенный повсюду; но в ISO для C++ компилятор выбирает в случае внешнего определения выходит.
В GNU C, вещи разные (подробнее об этом ниже).
Чтобы усложнить вещи далее, в GNU C++ позволяет писать статический встроенный для себя Экстерн встроенные в код C++... я бы'т, как угадать на что именно
Я так и не нашел применения ключевого слова в моей программы на C, и когда я вижу этого сайта в других людей's код, это's почти всегда статический встроенный
Многие кодеры не'т знаю, что они'повторно делать и просто собрали то, что, кажется, работает. Еще одним фактором здесь является то, что код, который вы'вновь глядя На, возможно, были написаны для GNU C, а не ИСО С.
В СИ GNU, равнина инлайн
ведет себя по-разному стандарту ISO C. Она на самом деле излучает видимый извне определение, поэтому `.H-файл с функцией простого "встроенный" в комплекте из двух единиц перевода вызывает неопределенное поведение.
Поэтому, если программист хочет поставить встроенные подсказки оптимизации в GNU C, то статическая встраиваемый требуется. С работы статический встроенный в ISO для C и GNU C, он's естественным, что человек осел за это и видя, что он явился на работу без объяснения ошибки.
, в котором я не вижу разницы с просто статические.
Разница только в намерениях, чтобы обеспечить скорость по оптимизации подсказку компилятору. Современные компиляторы это лишнее.
От 6.7.4 функции спецификаторы в С11 спецификаций
6 функции, объявленной с встроенный описатель функции встроенный функция. Что делает функция встроенная функция предполагает, что вызовы функция быть как можно быстрее.<суп>138)</с SUP>В той степени, в которой такие предложения эффективна реализации.<суп>139)</SUP и ГТ;
<суп>138) с помощью, например, альтернатива обычным вызовом функции механизм, такой как подстановки. Подстановки-это не текстовая замена, не создать новую функцию. Поэтому например, расширение макроса используется в теле функция используется определение в точке тела функции По-видимому, и не там, где функция вызывается; и идентификаторов см. В объявлениях в области, в которой организм происходит. Кроме того, функция имеет один адрес, независимо от количества встроенной определений, которые происходят в дополнение к внешним По определению.</SUP и ГТ;
<суп>139) например, реализация могла бы никогда не выполнять подстановки, или может выполнять только инлайн замены на звонки в рамках рядный декларации.</SUP и ГТ;
Это указывает компилятору, что эта функция широко используется и просит предпочитаете скорость вызова этой функции. Но с современными интеллектуальный компилятор это может быть больше или меньше значения не имеет, так как компиляторы могут решить, является ли функция должна быть включена и может игнорировать встроенный запрос от пользователей, потому что современные компиляторы могут очень эффективно решить о том, как вызывать функции.
статический встроенный недействительными Ф(недействительными) {}
не имеет никакой практической разницы сстатический недействительными Ф(недействительными) {}
.
Да с современными компиляторами большую часть времени нет. С любыми компиляторами нет нет практические / вывода наблюдаемых различий.
встроенные недействительными Ф(недействительными) {}` в C не't работа как C++ путь. Как это работа в C?
Функции, встроенные в любом месте должен быть встроен везде в C++ и компоновщик не жалуются на многочисленные ошибки определения (определения должны быть одинаковыми).
что на самом деле Экстерн встроенный недействительными Ф(недействительным); делать?
Это обеспечит внешние связи с F
. Потому что " Е "может присутствовать в другой единице компиляции, компилятор может выбрать различный механизм призывают ускорить звонки или игнорировать полностью "встроенный".
Функция, где все декларации (в том числе определение) упомянуть в тексте, а не Экстерн. Там должно быть определение в той же единице трансляции. Стандарт относится к этому как определение. Не изолированный объект, излучаемый код, поэтому это определение может'т быть вызваны из другой единицы трансляции.
В данном примере, все объявления и определения использование встроенных, но не Экстерн:
// a declaration mentioning inline
inline int max(int a, int b);
// a definition mentioning inline
inline int max(int a, int b) {
return a > b ? a : b;
}
Здесь - это ссылка, которая может дать вам более ясное представление о встроенных функциях в C &усилителя; также на использовании встроенного усилителя; amp; Экстерн.
Как слово и"встроенный" и говорит: "в" на "Линии" и, добавление этого сайта в функцию, влияющую на программу во время выполнения , когда программа компилируется ,код, написанный внутри функции вставляется при вызове функции , как вызовы функций являются более дорогостоящими, чем встроенный код, так это оптимизирует код. Так, статический встроенный недействительными Ф(недействительными) {} и статической силы Ф(недействительными) {} , в этом ключевое слово inline не делает разницы в рантайме. Но когда функция имеет слишком много строк кода, то он выиграл'т эффект во время выполнения. Если вы добавляете статические прежде чем функция , функция's время жизни это время жизни всей программы. И что польза функции ограничена только для этого файла. Знать о Экстерн вы можете обратиться к https://stackoverflow.com/questions/856636/effects-of-the-extern-keyword-on-c-functions