首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在运行时确定数据大小(已分配和已释放)

如何在运行时确定数据大小(已分配和已释放)
EN

Stack Overflow用户
提问于 2013-03-19 18:04:09
回答 2查看 108关注 0票数 1

我有两个问题:

1.)我想以函数的方式对我的代码进行内存分析。代码可以有任何STL容器。在linux中有没有办法做到这一点?

2.)第二个原因是我太天真了!如果我有一个数据结构

代码语言:javascript
运行
复制
template < class T1 > struct somestruct
{
std::set < T1 > v1;
std::vector < T1 > v2;
std::vector < T1 > v3;
};

我知道v1,v2和v3的大小,那么我可以根据sizeof(T1)直接计算结构的大小吗,或者我必须注意填充?

EN

回答 2

Stack Overflow用户

发布于 2013-03-19 18:19:05

我更喜欢在linux上使用the valgrind heap profiler

代码语言:javascript
运行
复制
valgrind --tool=massif ./testprogram

然后,

代码语言:javascript
运行
复制
ms_print ./massif.out.16766 # replace with actual generated name

代码语言:javascript
运行
复制
19.63^                                               ###                      
     |                                               #                        
     |                                               #  ::                    
     |                                               #  : :::                 
     |                                      :::::::::#  : :  ::               
     |                                      :        #  : :  : ::             
     |                                      :        #  : :  : : :::          
     |                                      :        #  : :  : : :  ::        
     |                            :::::::::::        #  : :  : : :  : :::     
     |                            :         :        #  : :  : : :  : :  ::   
     |                        :::::         :        #  : :  : : :  : :  : :: 
     |                     @@@:   :         :        #  : :  : : :  : :  : : @
     |                   ::@  :   :         :        #  : :  : : :  : :  : : @
     |                :::: @  :   :         :        #  : :  : : :  : :  : : @
     |              :::  : @  :   :         :        #  : :  : : :  : :  : : @
     |            ::: :  : @  :   :         :        #  : :  : : :  : :  : : @
     |         :::: : :  : @  :   :         :        #  : :  : : :  : :  : : @
     |       :::  : : :  : @  :   :         :        #  : :  : : :  : :  : : @
     |    :::: :  : : :  : @  :   :         :        #  : :  : : :  : :  : : @
     |  :::  : :  : : :  : @  :   :         :        #  : :  : : :  : :  : : @
   0 +----------------------------------------------------------------------->KB     0                                                                   29.48

Number of snapshots: 25
 Detailed snapshots: [9, 14 (peak), 24]

故障会是这样的

代码语言:javascript
运行
复制
--------------------------------------------------------------------------------
  n        time(B)         total(B)   useful-heap(B) extra-heap(B)    stacks(B)
--------------------------------------------------------------------------------
 10         10,080           10,080           10,000            80            0
 11         12,088           12,088           12,000            88            0
 12         16,096           16,096           16,000            96            0
 13         20,104           20,104           20,000           104            0
 14         20,104           20,104           20,000           104            0
99.48% (20,000B) (heap allocation functions) malloc/new/new[], --alloc-fns, etc.
->49.74% (10,000B) 0x804841A: main (example.c:20)
| 
->39.79% (8,000B) 0x80483C2: g (example.c:5)
| ->19.90% (4,000B) 0x80483E2: f (example.c:11)
| | ->19.90% (4,000B) 0x8048431: main (example.c:23)
| |   
| ->19.90% (4,000B) 0x8048436: main (example.c:25)
|   
->09.95% (2,000B) 0x80483DA: f (example.c:10)
  ->09.95% (2,000B) 0x8048431: main (example.c:23)
票数 1
EN

Stack Overflow用户

发布于 2013-03-19 18:26:54

结构的直接sizeof()将返回编译时的大小,即它不会考虑容器的实际大小。因此,您可能希望手动迭代每个容器,并将每个元素的大小相加。

但对你来说更简单的方法可能是使用profiler (例如gprof (GNU Profiler))或其他

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15496427

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档