может ли очень короткая функция стать встроенной, даже если она не была явно определена как встроенная?

<p>я заранее знаю, что при написании программы на c или c++, даже если я объявляю функцию как «встроенную», компилятор может игнорировать это и принимать решение не расширять ее при каждом (или любом) вызове.</p><p>верно ли и обратное? то есть может ли компилятор автоматически встроить очень короткую функцию, которая не была определена как встроенная, если компилятор считает, что это приведет к увеличению производительности?</p><p>два других вопроса: определено ли это поведение где-то в стандартах ansi? в этом отношении c отличается от c++ или ведет себя одинаково?</p>

<p><code>inline</code> не является обязательным в отношении того, будет ли функция встроена компилятором. первоначально это было то, что предполагалось сделать. но с тех пор стало понятно, что стоит ли встраивать функцию или нет, зависит от сайта вызова столько же, сколько и сама функция, и ее лучше оставить на усмотрение компилятора.</p><p>от <a href="https://en.cppreference.com/w/cpp/language/inline">https://en.cppreference.com/w/cpp/language/inline</a> : </p><blockquote> <p>поскольку это значение ключевого слова inline не является обязательным, <strong>compilers может свободно использовать inline-замену для любой функции, не помеченной inline</strong>, и может генерировать вызовы функций для любой функции, помеченной inline. эти варианты оптимизации не изменяют правила, касающиеся нескольких определений и общей статики, перечисленных выше.</p> </blockquote><p>правка: поскольку вы также просили c, с <a href="https://en.cppreference.com/w/c/language/inline">https://en.cppreference.com/w/c/language/inline</a> :</p><blockquote> <p>назначение встроенного спецификатора состоит в том, чтобы служить подсказкой для компилятора выполнить оптимизацию, такую как вставка функции, которая требует, чтобы определение функции было видимым на сайте вызова. <strong>компиляторы могут (и обычно делают) игнорировать наличие или отсутствие встроенного спецификатора с целью оптимизации</strong>.</p> </blockquote>

<p>что касается связи между c и c++, встроенный спецификатор обрабатывается по-разному в каждом языке.</p><ul> <li>в c++: встроенные функции (и функции, подобные сущностям, и переменные (начиная с c++ 17)), которые ранее не были объявлены с внутренней связью, будут иметь <strong>external linkage</strong> и будут видны из других модулей компиляции. поскольку встроенные функции (обычно) находятся в заголовочных файлах, это означает, что одна и та же функция будет иметь повторяющиеся определения в разных единицах компиляции (это будет нарушением правила определения <a href="https://en.cppreference.com/w/cpp/language/definition#one\_definition\_rule">one</a> но <code>inline</code> делает его легальным). в конце процесса сборки (при связывании исполняемого файла или разделяемой библиотеки) встроенные определения одного и того же объекта объединяются вместе. неформально c++ <code>inline</code> означает: «может быть несколько идентичных определений некоторых функций в нескольких исходных файлах, но я хочу, чтобы они в конечном итоге были уникальными».</li> <li>в c: если <code>extern</code> явно не указан, то определение встроенной функции не видно из других единиц перевода, разные единицы перевода могут иметь разные определения со спецификатором <code>inline</code> для одного и того же имени функции. кроме того, может существовать (самое большее) одно определение для имени функции, которое является одновременно <code>inline</code> и <code>extern</code>, и это квалифицирует эту функцию как ту, которая является видимой извне (то есть выбирается, когда каждый применяет адрес оператора <code>&</code> к имени функции) , правило определения one из c и его связь с <code>extern</code> и <code>inline</code> несколько отличается от c++.</li> </ul>

<blockquote> <p>может ли компилятор автоматически встроить очень короткую функцию, которая не была определена как встроенная, если компилятор считает, что это приведет к увеличению производительности?</p> </blockquote><p>ограничение:<br> когда в коде используется указатель на функцию, функция должна существовать без подстановки.</p><p>ограничение:<br> когда функция видна за пределами локального файла .c (не <code>static</code>), это предотвращает упрощенный встроенный код.</p><p>не ограничение:<br> длина функции не является абсолютным, хотя и практическим ограничением.</p><p>я работал со встроенным процессором, который обычно встроен <code>static</code> функции. (данный код не использует указатель на них.)</p><p>полезность ключевого слова <code>inline</code> не влияет на способность компилятора встроить функцию.</p>

<p>когда речь заходит о стандарте, ключевое слово <code>inline</code> имеет <em>ничто</em> для встраивания.</p><p>правила (в c++) в основном:</p><ul> <li>функция, которая <em>not</em> объявлена <code>inline</code>, может быть определена только в одном объединении переводов. это все еще должно быть delared в каждой единице перевода, где это используется.</li> <li>функция, которая объявлена <code>inline</code>, должна быть определена в каждой единице перевода, где она используется odr (ord-use означает, что вызывается функция или берется указатель, ...). </li> </ul><p>таким образом, в стандартной настройке проекта почти всегда правильно следовать следующим двум правилам. функции, которые определены в заголовочном файле, являются <em>всегда</em>, которые должны быть объявлены <code>inline</code>. функции, определенные в * .cpp-файле, никогда не объявляются <code>inline</code>.</p><p>тем не менее, я думаю, что компилятор не может сделать какие-либо выводы о том, что программист хотел бы использовать или не использовать ключевое слово <code>inline</code>. название ключевого слова - неудачное наследие от плохого именования.</p>