哪个工具可以在C++中显示方法或函数的最大语句
Which tool can show the maximum statements of Method or function in C++?
我们的项目真的很大。在一个模块中,源代码的大小约为620KLOC。所以我想检查目录/模块中哪个函数最大?有什么工具可以支撑它吗?
SourceMonitor只有"每个方法的平均语句数",而不是每个方法的最大语句数。CCCC也不支持。
例如。此函数长度为1。
unsigned short get()
{
return 1;
}
谢谢。
我能想到的最简单的就是编写脚本
- 使用ctags获取文件中的函数列表
- 使用perl/python/awk/grep将源文件拆分为单独的文件,每个函数一个文件
- 只需计算每个文件的行数,取最大长度。如果您需要更多详细信息,请将每个文件输入一个loc计数器,例如sloccount to
获取更精细的信息。再次使用grep来获得您的输出对…感兴趣
另一个可能有用的工具:
Lazy C++:Is是一个代码生成器,它将与C++非常相似的文件拆分为头文件和源文件。如果您编写并将代码转换为lzz文件,则生成的代码包括每个函数的行计数器标记。这些数字的差异将显示您的函数有多大
您可以使用我们的SourceMeter工具扫描您的项目,根据您的需要,它提供包含函数/方法的CSV文件,其中包含度量(以及您正在寻找的其他大小度量)和包含模块(例如库、共享对象、可执行文件)。使用电子表格编辑器,您可以很容易地找到每个模块最大的函数/方法。
我认为许多静态分析工具可能无法满足您的需求,因为它们不一定考虑模板实例化、标头包含(包括预编译标头引入的标头)和编译器的代码生成特性。
我过去也遇到过类似的问题,一个大型可执行文件的大小由一个特定的库决定。我了解它的方法只是简单地查看每个.cpp的对象文件的大小。这不会给你完整的故事,因为链接器会优化掉未使用的部分(尽管值得检查的是,你已经设置了选项集-Visual Studio的/OPT:REF
)。不过,它可以让你集中搜索。找到两个或三个最大的对象文件,然后查看相应的.cpp文件。然后您有两个选项-编写一个接受objdump
(VisualStudio)或nm -C
(gcc)输出的脚本,在其中您可以提取模块中每个函数的偏移量,因此您可以将每个函数与前一个函数进行比较,以了解每个函数的大小。
或者最简单的方法就是在cpp文件上使用二进制搜索#ifdef出#includes结束后的所有代码并对其进行编译。这将使您了解includes的开销(如果它本身很大,那么您可以深入到标头includes中,找出贡献最大的部分)。接下来,用#ifdef禁用代码的每一半,并找出哪一半更大。使用这种方法,您可以快速找到对库的大小贡献最大的函数。
在我拥有的库也有同样的问题的情况下,原因是一个非常大的模板函数,每次保存成员变量时都会实例化它。这种情况下的解决方案是使函数具体化,这样所有不需要特定类型行为的代码都只实例化一次,并且模板函数针对特定类型的逻辑位进行本地化。
CppDepend提供此信息,它基于Clang,使用CQLinq,您可以根据需要请求代码。
- 如何在 c++ 的类中递归调用函数方法?
- 通过构造函数方法输出的类到类类型转换是 5500 为什么不是 5555
- 在 *.cpp 文件中实现的 c++ 函数/方法永远不会内联扩展吗?
- 如果子类中没有构造函数方法,则错误"no matching function for call to 'LGame::LGame(String&)'"
- 指向类中函数方法的指针不起作用
- 如何发送通过绑定到函数/方法创建的函数对象?
- 编译错误,未创建函数/方法! 对于 brms 模型
- 对静态重载(类)函数/方法的调用是不明确的
- 复制构造函数方法的用法
- C/C++ 函数/方法与 Java 的公开
- std ::函数方法参考无法将dword投入到dword64
- 链表的析构函数方法
- 为什么在类构造函数方法中,std::string 参数在调试时显示不同的结果?
- 我的构造函数方法不接受参数(DirectX / Windows)
- 当函数/方法应该要求 * 或 &
- 带有常量构造函数参数的C++变量构造函数方法
- 使用模板递归检查函数方法是否存在
- 如何通过析构函数方法删除对象(类)
- 为什么在 Java 和 C++ 中不允许隐藏虚拟函数/方法?
- 在构造函数方法中返回一个子类