2009-03-17 8 views
1
стандарт

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

"A function defined within a class definition is an inline function." 

Есть ли компиляторы, игнорирующие это правило?
(пожалуйста, не путайте рядный с встраиваемыми - мой вопрос, если есть компилятор, что привычка ставить там рядный предположение, что он должен)

ответ

5

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

Edit: Просто чтобы прояснить - спрашивающий игнорирует это, из предыдущего пункта в стандарте к тому, что он процитировал:

Реализация не требуется, чтобы выполнить эту инлайн замену в точка вызова

+0

запрет на вызовы деструктора, хвостовые рекурсивные функции могут быть «встроены» в цикл, хотя это растягивает определение inline.:) – 2009-03-17 14:55:36

+0

благодарю вас за ответ, но это не ответит на мой вопрос –

+0

, тогда сделайте свой вопрос яснее – 2009-03-17 16:16:23

8

Вы, кажется, неправильно понимаете, что означает «встроенный». Это не означает, что функции будут автоматически встроены; в соответствии с п. 7.1.2-2 это указывает на то, что предпочтительным является встроенное замещение.

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

+0

Я считаю, что каждый компилятор, следующий за этим стандартом, включил бы функцию EMPTY. Предположим, что эта пустая функция называется миллионом раз в цикле - я считаю, что компилятор ДОЛЖЕН встроить ее, потому что эффективность будет равна 1000000 * call_time/0 * inlined_nothing. –

+0

вы можете поверить, что вам нравится - это не так. – 2009-03-17 16:15:41

+1

Фактическая вставка - это проблема качества реализации. Компилятор совершенно свободен для встроенных или нет. Если вам это не нравится, посмотрите, меняются ли параметры, или получите другой компилятор. –

0

Компилятор обычно встроен в зависимости от количества вызовов функции, количества псевдо-команд в функции и множества других вещей. Взгляните на GCC documentation on optimization options, чтобы понять, как это происходит. В принципе, ключевое слово inline - это всего лишь подсказка, которая повышает вероятность того, что компилятор будет встроен. Фактическое решение inline обычно сложное.

4

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

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

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

2

Смотрите мой ответ на очень похожий вопрос: When is "inline" ineffective? (in C)

Резюме: рядный только требуется, чтобы несколько определений. Любая функция, вызывающая изменения, является необязательной.

+1

Обратите внимание, что этот другой ответ о C. в C++ отличается: он не требует «только одного внешнего определения» функции, если вы используете встроенную функцию: самой встроенной функцией является это определение в C++. в C это не так, но это всего лишь «встроенное определение». –

+0

Я знаю, но на самом деле я перечитал соответствующие термины для C++, для этого вопроса мало практических различий: это все о том, что вы не понимаете, что на самом деле означает inline. – Richard