Есть ли компиляторы, которые IGNORE C ++ стандартно для встроенных функций по умолчанию? - PullRequest
1 голос
/ 17 марта 2009

C ++ Стандарт ISO гласит, что:

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

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

Ответы [ 5 ]

8 голосов
/ 17 марта 2009

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

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

5 голосов
/ 17 марта 2009

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

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

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

4 голосов
/ 17 марта 2009

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

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

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

2 голосов
/ 17 марта 2009

См. Мой ответ на очень похожий вопрос: Когда «встроенный» неэффективен? (в С)

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

0 голосов
/ 17 марта 2009

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

...