如何在我的源代码中找到所有发生的情况,其中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?
我正在优化一个大型项目,并希望用'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具有许多其他很酷的代码分析功能,可以在重构中有用:它可以包括图表,班级图,呼叫图等。
相关文章:
- 将(临时的?)std::string传递给使用它来构造一个接受副本的对象的函数的最佳方法是什么?
- 如果子类中没有构造函数方法,则错误"no matching function for call to 'LGame::LGame(String&)'"
- Arduino trim() 和 replace() 方法返回从 'void' 到非标量类型'String'请求的转换
- 从类方法返回 "const char*" 作为 std::string&
- 将空填充但不以空结尾的固定长度字符数组转换为 std::string 的最佳方法
- 自动将 std::string 转换为 char* 而无需每次都调用 c_str() 的最佳方法
- 在 Extern "C" 中将 List<String^> 返回到 Vector<std::string> 的正确方法?
- C++ std::string 中是否有任何函数可以计算两个字符串的相同起始字符的总数或任何最佳方法
- std::copy with return values - 防止"expression: string iterators incompatible"的更好方法?
- 如何从JSON String创建工厂方法
- 如何在我的源代码中找到所有发生的情况,其中std :: string被传递给方法作为副本而不是恒定引用
- 为什么在类构造函数方法中,std::string 参数在调试时显示不同的结果?
- 如何让一种方法采用 vector&&<string>&而不是 vector<string>?
- boost-python 当C++方法返回 std::map<string,X*>
- 链接webrtc本机时出错,因为未定义对具有std::string的方法的引用
- 如何为 Product* getProductFromID(std::string)编写方法定义;.
- 用一个字符制作 std::string 的最佳方法是什么?
- 是否有STD :: String子字符串的替代方法
- 在文件中存储已知最大长度的字符串以快速加载到C++矢量的最佳方法<string>
- 检查字符串是否包含矢量值的有效方法<string>?