3

От моего преподавателя курса он неоднократно подчеркивал и просил нас не использовать ключевое слово "inline" для функций. Он говорит, что он не «переносится» среди компиляторов и не является «стандартным». Учитывая это, существуют ли «стандартные» альтернативы, которые допускают «встроенное расширение»?Альтернативы ключевому слову C "inline"

+2

Несмотря на то, есть ли на самом деле даже потребность * до * использовать `inline`? Если бы я был инструктором, я бы предупреждал об этом - «оптимизация». – 2010-11-29 04:09:52

ответ

18

Ваш инструктор курса ошибается. Это есть стандарт. Фактически это в нынешнем стандарте, прямо там, в разделе 6.7.4 Function specifiers (C99). Тот факт, что это предложение компилятору, которое может быть полностью проигнорировано, не делает его менее стандартным.

Я не думаю, что это было в C89/90, что может быть тем, что используют некоторые встроенные компиляторы, но я бы дал серьезный рассмотрение вопроса об обновлении в этом случае.

Однако, даже там, где доступно inline, я обычно оставляю эти решения до самого компилятора, поскольку самые современные из них более чем способны определить, как лучше всего оптимизировать код (и обычно намного лучше, чем я). Ключевое слово inline, как register и auto, не является чем-то, о чем я обычно беспокоюсь вообще.

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

Или вы можете вручную ввести код (например, дублировать его), хотя я бы не предлагал это как вариант, так как он может быстро стать кошмаром для обслуживания.

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

Вы всегда должны предполагать, что кодировщик, который должен поддерживать ваш код убийца-психопат, который знает, где вы живете :-)

+6

+1 Важно помнить, что, несмотря на то, что ключевое слово `inline` является стандартным, компиляторы теперь достигли точки, где они умнее большинства из нас в большинстве случаев. То, что ваш профессор * возможно, получает, заключается в том, что вы не должны пытаться самостоятельно принимать эти решения, а скорее оставлять его компилятору, чтобы решить, когда это наиболее уместно. – 2010-11-29 04:13:18

+0

Да, некоторые из кода, который я видел, gcc emit на его «безумном» уровне оптимизации, заставили меня понять. – paxdiablo 2010-11-29 04:14:45

+1

Где мы можем найти хорошую ссылку, которая объясняет все эти проблемы? Im Another Student – Muggen 2010-11-29 04:35:31

0

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

0

Вот, теперь это «портативный через компиляторы»:

#if (__STDC_VERSION__ < 199901L) 
#define inline 
#endif 
static inline int foobar(int x) /* ... */ 

Кстати, как говорили другие, ключевое слово inline - всего лишь намек и скорее бесполезно, но важным ключевым словом является static. Если ваша функция не объявлена ​​static, она будет иметь внешнюю связь, и компилятор вряд ли рассмотрит ее как кандидат для встраивания, когда он принимает собственные решения о том, какие функции встроены.

Также обратите внимание, что в отличие от C++ язык C не разрешает inline без static.

2

Как уже говорилось, inline был интегрирован в стандарт C 11 лет назад.

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

Пожалуйста, посмотрите на это сообщение: Myth and reality about inline in C99

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