我们的项目真的很大。一个模块的源代码大小约为 620KLOC。所以我想检查目录/模块中哪个函数最大?有什么工具可以支持吗?
SourceMonitor 只有“每个方法的平均语句”,而不是每个方法的最大语句。CCCC 也不支持。
例子。该函数长度为 1。
unsigned short get()
{
return 1;
}
谢谢。
我能想到的最简单的事情就是编写脚本。
另一个可能有用的工具:
Lazy C++: Is 是一个代码生成器,它将与 c++ 非常相似的文件拆分为 header 和 source。如果您将代码转换为 lzz 文件,则生成的代码包括每个函数的行计数器标记。这些数字的差异会告诉你你的功能有多大
您可以使用我们的SourceMeter工具扫描您的项目,并根据您的需要提供 CSV 文件,其中包含带有指标的函数/方法(以及您正在寻找的其他大小指标)以及包含模块(例如库、共享对象、可执行文件)。使用电子表格编辑器,您可以轻松找到每个模块最大的功能/方法。
CppDepend为您提供此信息,它基于 Clang 并且使用 CQLinq 您可以根据需要请求您的代码。
我认为许多静态分析工具可能无法满足您的需求,因为它们不一定会考虑模板实例化、头文件包含(包括那些由预编译头文件引入的内容)和编译器的代码生成特性。
我过去也遇到过类似的问题,一个大型可执行文件的大小由特定库控制。我深入了解它的方法只是查看每个 .cpp 的目标文件的大小。这不会为您提供完整的故事,因为链接器会优化未使用的部分(尽管值得检查您是否设置了该选项 -/OPT:REF
对于 Visual Studio)。不过,它可以让您专注于搜索。找到两个或三个最大的目标文件,然后查看对应的 .cpp 文件。然后,您有两个选择 - 编写一个脚本,该脚本采用objdump
(VisualStudio) 或nm -C
(gcc) 的输出,您可以在其中提取模块中每个函数的偏移量,这样您就可以将每个函数与前一个函数进行比较以了解每个函数的大小。
或者最简单的方法就是对 cpp 文件使用二进制搜索。#ifdef 将#includes 结束后的所有代码取出并编译。这将使您了解包含的开销(如果它本身很大,那么您可以深入研究标题包含以找出贡献最大的内容)。接下来,使用#ifdef 禁用每一半代码并找出哪一半较大。使用这种方法,您可以快速找到对库大小贡献最大的函数。
就我所拥有的库而言,它也有同样的问题,原因是每次保存成员变量时都会实例化一个非常大的模板化函数。在这种情况下,解决方案是使函数具体化,以便所有不需要特定类型行为的代码只实例化一次,并且模板函数针对特定类型的逻辑位进行本地化。