2010-09-06 3 views
8

Стоит ли использовать ключевое слово inline или компилятор достаточно умен, чтобы знать, когда ему нужно встроить функцию?C: Стоит ли ключевое слово inline?

+4

Замечание не стоит отвечать: если вы не собираетесь использовать функцию извне компиляции, в которой находится, ключевое слово «static» делает больше, чтобы помочь компилятору, чем «inline». Затем компилятор может быть, например, встроен независимо от размера, если есть один сайт вызова. –

ответ

9

Компилятор довольно умный и имеет множество показателей, чтобы выяснить, стоит ли что-то сделать. Но иногда, однако, разработчик будет иметь представление о том, как приложение будет запущено, и будет знать, что делать, что компилятор не делает автоматически. Тем не менее, я никогда не буду вводить данные вручную, если бы у меня не было некоторых тестов, и я обнаружил, что встроенный улучшит мою производительность.

Вы можете узнать больше о том, как GCC uses inline.

3

Его всегда стоит говорить о намерениях.

Его также стоит отметить, что компилятор даже не нужен, если он думает, что его лучше не слишком.

13

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

Чтобы получить функцию, встроенную в более чем один .c файл, вы помещаете определение функции в файл .h. И если вы не отметите их inline, компоновщик будет жаловаться на несколько определений.

+2

+1, 'inline' в настоящее время означает« разрешить несколько определений ». Тот факт, что это также намек на компилятор, чтобы «быстро вызвать вызов этой функции», - это несвязанный и нерелевантный побочный эффект :-) Я думаю, что дело не в том, что «способ создания программ» не продвинулся - некоторые компиляторы/линкеры иметь. Но самый низкий общий знаменатель, который позволяет стандарт, не продвинулся. –

+9

Говорить 'inline' означает« разрешить несколько определений »просто неправильно. Этот вопрос касается языка C, а не C++. C не имеет функций 'extern inline', ключевое слово' inline' недопустимо без 'static', и несколько определений функции никогда не разрешаются. –

0

Стандарт говорит

7.1.2 Функция спецификаторам

2.   объявление функции (8.3.5, 9.3, 11.4) с инлайн спецификатор объявляет функцию инлайн. Спецификатор inline указывает на реализацию, что встроенная подстановка тела функции в точке вызова предпочтительнее обычного механизма вызова функции. Реализация не требуется для выполнения этой встроенной подстановки в точке вызова; однако, даже если эта встроенная замена опущена, другие правила для встроенных функций, определенных в 7.1.2, все равно должны соблюдаться.

Так что я бы уподобить inline, может быть, <br /> в HTML - это хорошая практика, чтобы использовать Самозапирающийся <br /> все время. Но можно утверждать, что почти все версии относятся к <br> и <br /> точно так же, что ИМО пропускает точку.

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

Смежные вопросы