Ошибка регулярного выражения Lookbehind c ++ [duplicate]

О, человек, один из моих питомцев.

inline больше похож на static или extern, чем на директиву, сообщающую компилятору встроить ваши функции. extern, static, inline являются директивами привязки, которые используются почти исключительно компоновщиком, а не компилятором.

Говорят, что inline намекает компилятору, что, по вашему мнению, функция должна быть встроенным. Это могло быть правдой в 1998 году, но десятилетие спустя компилятор не нуждается в таких подсказках. Не говоря уже о том, что люди обычно ошибаются, когда дело доходит до оптимизации кода, поэтому большинство компиляторов полностью игнорируют «подсказку».

  • static - имя переменной / функции не может использоваться в другом переводе единицы. Linker должен убедиться, что он случайно не использует статически определенную переменную / функцию из другой единицы перевода.
  • extern - используйте это имя переменной / функции в этой единицы перевода, но не жалуйтесь, если это не определено. Компилятор будет сортировать его и убедиться, что весь код, который пытался использовать какой-либо символ extern, имеет свой адрес.
  • inline - эта функция будет определена в нескольких единицах перевода, не беспокойтесь об этом , Компилятор должен убедиться, что все единицы перевода используют один экземпляр переменной / функции.

Примечание. Как правило, объявление шаблонов inline бессмысленно, так как они имеют семантику связи inline уже. Тем не менее, специализация explicit и создание экземпляров шаблонов требуют использования inline .


Конкретные ответы на ваши вопросы:

  • Когда следует писать ключевое слово 'inline' для функции / метода в C ++? Только когда вы хотите, чтобы функция была определена в заголовке. Точнее, только когда определение функции может отображаться в нескольких единицах перевода. Это хорошая идея, чтобы определить небольшие (как в одном лайнере) функции в файле заголовка, поскольку он дает компилятору больше информации для работы с оптимизацией кода. Это также увеличивает время компиляции.
  • Когда я не должен писать ключевое слово 'inline' для функции / метода в C ++? Не добавляйте встроенную строку только потому, что считаете, что ваш код будет работать быстрее, если компилятор сделает это.
  • Когда компилятор не знает, когда нужно сделать функцию / метод «inline»? Как правило, компилятор сможет сделать это лучше вас. Однако компилятор не имеет возможности встроить код, если он не имеет определения функции. Обычно в максимально оптимизированном коде все методы private встроены независимо от того, запрашиваете вы это или нет. Для предотвращения встраивания в GCC используйте __attribute__(( noinline )), а в Visual Studio используйте __declspec(noinline).
  • Имеет ли значение, если приложение многопоточно, когда вы записываете «inline» для функции / метода ? Многопоточность никак не влияет на inlining.

9
задан ildjarn 27 January 2013 в 01:03
поделиться

1 ответ

C ++ 11 <regex> использует синтаксис регулярных выражений ECMAScript (ECMA-262), поэтому он не будет иметь внешний вид (другие варианты регулярного выражения, поддерживаемые C ++ 11, также не имеют внешнего вида).

Если ваш вариант использования требует использования look-behind, вы можете вместо этого использовать Boost.Regex .

18
ответ дан nhahtdh 26 August 2018 в 01:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: