Являются ли свободные функции неявно встроенными, если они определены без предыдущего объявления в C ++?

StackOverflow https://stackoverflow.com/questions/1082083

Вопрос

Является ли следующая свободная функция неявно встроенной в C ++, аналогично тому, как неявно встроены функции-члены, если они определены в определении класса?

void func() { ... }

Ведут ли себя шаблонные функции таким же образом?

Это было полезно?

Решение

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

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

Конечно, компилятор все еще может встроить функцию, если он считает, что это будет эффективно, но это не то же самое, что явное встраивание.

Шаблонные функции неявно встроены в том смысле, что для них не требуется inline чтобы предотвратить множественные ошибки определения.Я не думаю, что компилятор также вынужден их встроить, но я не уверен.

Другие советы

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

inline void func() { ... }

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

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

Он может быть встроенным, в зависимости от того, решит ли компилятор сделать его встроенным или нет.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top