Aru*_*run 5 c++ size containers analysis
我正在尝试分析一个大型的C++程序.该程序大量使用STL容器数据结构,如集合,映射,无序集,无序映射,向量等.有时它们是嵌套的,例如集合映射.
我想在程序的特定运行中找出哪些容器包含最多元素(即size()的最大值).我可以对程序进行少量编辑.
如果有办法迭代所有容器,或者有方法拦截容器的(大小修改)API,那可能会有所帮助.但这些都是不可能的.
你会怎么做?
另外:在Linux中的平台,编译器是g ++或clang ++.
当您的项目非常大并且具有大量不同容器的实例时,此方法非常有用。该方法的优点是不需要修改大量代码。它可以让您缩小查找容器的类型。此方法有助于诊断每个容器和每种类型的情况。
重新定义是可能的template< class T > struct allocator。可以重命名 std 标头中的原始分配器或修改它。可以对分配和释放进行统计。您将了解每种类型元素的数量和大小。但您无法知道哪个容器实例包含元素。
模板template< class T > struct allocator放置在库头文件中。它始终存在,不需要重建您的开发环境库,因为据您所知,模板不可能编译成静态库(排除专业化)。模板始终与您的源一起编译。但预编译头可能有问题。对于项目,可以重新生成或不使用它,但对于库,需要检查。这可能是方法的瓶颈,但很容易验证是否存在问题。
有一种经验方法不能保证准确性。当您的应用程序关闭时,容器会在其元素释放后释放。因此,您可以为每个父类型容器编写统计信息,即哪种类型的容器中有多少内部元素。
例如让我们有:
vector<A>({1,2,3}) and map<string,B>({1,2}) and map<string,B>({1,2})
Run Code Online (Sandbox Code Playgroud)
这将生成如下的释放事件列表:
B, B, map<string,B>,
A, A, map<string,A>,
A, A, A, vector<A>,
Run Code Online (Sandbox Code Playgroud)
所以你可以知道 3 个元素Aat vector<A>、 2 个元素Aat map<string,A>、 2 个元素Aatmap<string,A>