Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在源代码中找到std::string作为副本而不是常量引用传递给方法的所有实例?_C++_Visual Studio 2012_Stdstring - Fatal编程技术网

C++ 如何在源代码中找到std::string作为副本而不是常量引用传递给方法的所有实例?

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

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

到目前为止,我试图找到“string”的所有引用,但有超过11k行的引用要检查,包括那些字符串是类字段的引用,并作为常量引用传递(不可替换)

1)您可以使用Cppcheck和parse输出

main.cpp:

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>