О, человек, один из моих питомцев.
inline
больше похож на static
или extern
, чем на директиву, сообщающую компилятору встроить ваши функции. extern
, static
, inline
являются директивами привязки, которые используются почти исключительно компоновщиком, а не компилятором.
Говорят, что inline
намекает компилятору, что, по вашему мнению, функция должна быть встроенным. Это могло быть правдой в 1998 году, но десятилетие спустя компилятор не нуждается в таких подсказках. Не говоря уже о том, что люди обычно ошибаются, когда дело доходит до оптимизации кода, поэтому большинство компиляторов полностью игнорируют «подсказку».
static
- имя переменной / функции не может использоваться в другом переводе единицы. Linker должен убедиться, что он случайно не использует статически определенную переменную / функцию из другой единицы перевода. extern
- используйте это имя переменной / функции в этой единицы перевода, но не жалуйтесь, если это не определено. Компилятор будет сортировать его и убедиться, что весь код, который пытался использовать какой-либо символ extern, имеет свой адрес. inline
- эта функция будет определена в нескольких единицах перевода, не беспокойтесь об этом , Компилятор должен убедиться, что все единицы перевода используют один экземпляр переменной / функции. Примечание. Как правило, объявление шаблонов inline
бессмысленно, так как они имеют семантику связи inline
уже. Тем не менее, специализация explicit
и создание экземпляров шаблонов требуют использования inline
.
Конкретные ответы на ваши вопросы:
private
встроены независимо от того, запрашиваете вы это или нет. Для предотвращения встраивания в GCC используйте __attribute__(( noinline ))
, а в Visual Studio используйте __declspec(noinline)
. C ++ 11 <regex>
использует синтаксис регулярных выражений ECMAScript (ECMA-262), поэтому он не будет иметь внешний вид (другие варианты регулярного выражения, поддерживаемые C ++ 11, также не имеют внешнего вида).
Если ваш вариант использования требует использования look-behind, вы можете вместо этого использовать Boost.Regex .