如何在我的源代码中找到所有发生的情况,其中std :: string被传递给方法作为副本而不是恒定引用

How to find all occurrences in my source code where std::string is passed to methods as a copy rather than a constant reference?

本文关键字:方法 string 副本 引用 std 源代码 我的 其中 情况      更新时间:2023-10-16

我正在优化一个大型项目,并希望用'const std :: string&'将类型'std :: string'的传递参数替换为方法。尽可能。我如何找到所有出现在我的源代码树中作为副本传递到方法的所有事件?我正在使用Visual Studio 2012,但也可以在任何方便的IDE/OS中进行此操作。

到目前为止>

1(您可以使用cppcheck和parse输出。

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的手动和解析输出。

一个选项将使用静态代码分析仪(您可以Google,其中很多(。他们通常建议进行这种优化。

另一个选项是使用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,然后在输出XML中搜索所有string参数,而无需随后的&*。例如。使用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具有许多其他很酷的代码分析功能,可以在重构中有用:它可以包括图表,班级图,呼叫图等。

相关文章: