Подставляемая функция

253
23 января 2018, 12:23

В чём смысл подставляемой функции в С++? Я понимаю перед типом возвращаемого значения нужно писать inline? Но в чём все-таки разница между обычной и подставляемой функциями?

Answer 1

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

У inline-функций есть другое свойство. Функции по-умолчанию имеют внешнюю линковку (external linkage). Например, если Вы определите функцию в заголовочном файле, а затем включите этот файл в несколько единиц трансляции, то при линковке получите ошибку - множественное определение данной функции. Но если функция будет inline, то такой ошибки не возникнет, т.к. для inline-функций имеется специальное правило:

Every program shall contain exactly one definition of every non-inline function or variable that is odr-used in that program; no diagnostic required. The definition can appear explicitly in the program, it can be found in the standard or a user-defined library, or (when appropriate) it is implicitly defined (see 12.1, 12.4 and 12.8). An inline function shall be defined in every translation unit in which it is odr-used.

...

There can be more than one definition of a class type (Clause 9), enumeration type (7.2), inline function with external linkage (7.1.2), class template (Clause 14), non-static function template (14.5.6), static data member of a class template (14.5.1.3), member function of a class template (14.5.1.1), or template specialization for which some template parameters are not specified (14.7, 14.5.5) in a program provided that each definition appears in a different translation unit, and provided the definitions satisfy the following requirements.

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

READ ALSO
Функция работает неправильно 2018

Функция работает неправильно 2018

Есть список и есть функция addДобавляем элементы, а с функцией doubling удваиваем

294
массив символов С++

массив символов С++

Почему выводит весь массив символов(всю строку)? Если там будет,допустим, массив целочисельный,то выведет всего лишь адрес первого элемента

234
статическая переменная в классе

статическая переменная в классе

Для чего нам нужно еще раз объявлять статическую переменную вне класса, указывать область видимости, если я уже в классе определил ее как...

241
Как правильно записать в std::unordered_map?

Как правильно записать в std::unordered_map?

Мне нужно в мапу histogram записать значенияЯ записываю, но выдает ошибки

275