C++ 如何在源代码中找到std::string作为副本而不是常量引用传递给方法的所有实例?
我正在优化一个大型项目,并希望尽可能将“std::string”类型的传递参数替换为“const std::string&”。如何在源代码树中找到字符串作为副本传递给方法的所有实例?我使用的是Visual Studio 2012,但也可以在任何方便的IDE/OS中执行此操作 到目前为止,我试图找到“string”的所有引用,但有超过11k行的引用要检查,包括那些字符串是类字段的引用,并作为常量引用传递(不可替换)1)您可以使用Cppcheck和parse输出 main.cpp:C++ 如何在源代码中找到std::string作为副本而不是常量引用传递给方法的所有实例?,c++,visual-studio-2012,stdstring,C++,Visual Studio 2012,Stdstring,我正在优化一个大型项目,并希望尽可能将“std::string”类型的传递参数替换为“const std::string&”。如何在源代码树中找到字符串作为副本传递给方法的所有实例?我使用的是Visual Studio 2012,但也可以在任何方便的IDE/OS中执行此操作 到目前为止,我试图找到“string”的所有引用,但有超过11k行的引用要检查,包括那些字符串是类字段的引用,并作为常量引用传递(不可替换)1)您可以使用Cppcheck和parse输出 main.cpp: void bar
void bar(string str) {
cout << str;
}
输出:
Checking main.cpp ...
[main.cpp:5]: (performance) Function parameter 'str' should be passed by const reference.
2) 同样,叮当整洁也可以采取同样的行动。
例如
您可以手动使用Clang analize并解析输出。一个选项是使用静态代码分析器(您可以在谷歌上搜索,其中有很多)。他们通常建议这样的优化 另一个选择是使用。它可以解析代码并以易于搜索的标准格式列出所有函数。要执行此操作,请在配置文件中设置最大输出选项(即使使用默认选项,也可能有效,但以防万一) 并启用XML输出
GENERATE_XML = YES
然后在项目上运行doxygen
,搜索所有字符串
参数,在输出XML中不包含后续的&
或*
。例如,使用grep
:
grep -B 1 -E '<argsstring>.*string [^&*].*</argsstring>' *.xml > result.txt
grep-b1-E.*string[^&*].*.xml>result.txt
这应该是
classMyClass.xml- <definition>void MyClass::myMethod</definition>
classMyClass.xml: <argsstring>(std::string x)</argsstring>
classMyClass.xml-void MyClass::myMethod
classMyClass.xml:(标准::字符串x)
Doxygen还有许多其他很酷的代码分析功能,这些功能在重构中非常有用:它可以生成包含图、类图、调用图等。通过值传递
std::string
是正确的,如果它随后被移动。可以说,您应该禁止所有发生的const std::string&
传递,并使用std::string
或std::string\u视图
。正则表达式似乎是合理的。如果需要覆盖诸如Type Debug Engult:St::String s之类的复杂情况,那么考虑CLAG-QUIRS。优化时,首先测量(第二次,一旦完成,再次测量)。如果没有测量,你怎么知道你所做的会产生积极的影响?您的努力可能会更好地投资于其他地方。但如果我真的必须这样做,我会使用一个编辑器到bits/basic_string.h
,并将复制构造函数标记为[[deprecated]]]
,使用时会生成警告。
grep -B 1 -E '<argsstring>.*string [^&*].*</argsstring>' *.xml > result.txt
classMyClass.xml- <definition>void MyClass::myMethod</definition>
classMyClass.xml: <argsstring>(std::string x)</argsstring>