Как найти все вхождения в моем исходном коде, где std :: string передается методам как копия, а не постоянная ссылка? - PullRequest
1 голос
/ 07 мая 2019

Я оптимизирую большой проект и хочу заменить передаваемые аргументы типа 'std :: string' на методы 'const std :: string &', где это возможно. Как я могу найти все случаи, когда строки передаются в методы как копия в моем дереве исходного кода? Я использую Visual Studio 2012, но могу также сделать это в любой удобной IDE / OS.

До сих пор я пытался найти все вхождения 'string', но просмотрел более 11 тыс. Строк вхождений, в том числе те, где строки являются полями класса и переданы в виде константных ссылок (которые не подлежат замене)

Ответы [ 2 ]

1 голос
/ 07 мая 2019

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

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

EXTRACT_ALL            = YES
EXTRACT_PRIVATE        = YES
EXTRACT_PACKAGE        = YES
EXTRACT_STATIC         = YES
EXTRACT_LOCAL_CLASSES  = YES
EXTRACT_LOCAL_METHODS  = YES
EXTRACT_ANON_NSPACES   = YES
HIDE_UNDOC_MEMBERS     = NO
HIDE_UNDOC_CLASSES     = NO
HIDE_FRIEND_COMPOUNDS  = NO
HIDE_IN_BODY_DOCS      = NO

и включить вывод XML

GENERATE_XML           = YES

Затем запустите doxygen над вашим проектом и найдите все string аргументы без последующих & или * в выходных XML. Например. используя grep:

 grep -B 1 -E '<argsstring>.*string [^&*].*</argsstring>' *.xml > result.txt

Это должно получить что-то вроде

classMyClass.xml-        <definition>void MyClass::myMethod</definition>
classMyClass.xml:        <argsstring>(std::string x)</argsstring> 

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

1 голос
/ 07 мая 2019

1) Вы можете использовать Cppcheck и анализировать вывод.

main.cpp:

void bar(string str) {
    cout << str; 
}

терминал:

cppcheck --enable=performance test.cpp

вывод:

Checking main.cpp ...
[main.cpp:5]: (performance) Function parameter 'str' should be passed by const reference.

2) Точно так же может действовать лягушка.Например, CLion показывает предупреждение о бесполезном копировании строки

Вы можете использовать Clang для анализа вручную и анализа выходных данных.

...