Зачем явно указывать "inline" в С++

Возможный дубликат:
Когда следует писать ключевое слово 'inline' для функции/метода?

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

Таким образом, я хотел бы знать, в чем преимущество явного указания функции как строки? Пока включена оптимизация, компилятор выполнит все функции, которые он считает разумными, и только те функции.

Я нашел несколько дискуссий вокруг встроенной защиты от множества определений из-за вложенных h файлов, но, безусловно, # ifdefine'''ий исходный код заголовка лучше практикуется и снова отображает использование ключевого слова inline void?

Ответы

Ответ 1

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

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

Защитные устройства заголовка защищают только от нескольких определений на одной и той же переводческой единице. Они не работают через единицы перевода.

Ответ 2

Защитники заголовков не защищают от множества ошибок определения.

Множество определений встречается компоновщиком и происходит, когда одно и то же определение включено в отдельные единицы компиляции.