Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何计算内存分配的数量_C++_Linux_Memory Management - Fatal编程技术网

C++ 如何计算内存分配的数量

C++ 如何计算内存分配的数量,c++,linux,memory-management,C++,Linux,Memory Management,我想计算程序中内存分配调用的数量(malloc、calloc、new…)。该程序主动使用STL容器。 主要目的是统计所有这些容器中的内存分配。稍后我将使用此信息优化性能。 我的程序是用C++编写的,在Linux下运行。有什么工具可以做吗?您可以重新定义要计算的运算符 :这是我在Linux的C++开发环境中所做的一些事情。 您可能需要将iostream更改为stdio.h,将cstdlib更改为stdlib.h(可能还需要将std更改为与windows名称空间相匹配),以使其在windows中工作

我想计算程序中内存分配调用的数量(malloc、calloc、new…)。该程序主动使用STL容器。 主要目的是统计所有这些容器中的内存分配。稍后我将使用此信息优化性能。
我的程序是用C++编写的,在Linux下运行。有什么工具可以做吗?

您可以重新定义要计算的运算符


这是我在Linux的C++开发环境中所做的一些事情。 您可能需要将iostream更改为stdio.h,将cstdlib更改为stdlib.h(可能还需要将std更改为与windows名称空间相匹配),以使其在windows中工作

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include <iostream>
#include <cstdlib>


static char **ms;
using namespace std;

class frag{

    public:
    int xyz;

};

int numsegments(char** segs){
    return strlen((const char*)segs)/sizeof(char*);
}

void randomfunction1(){
    ms[numsegments(ms)]=(char*)malloc(100);
}

void randomfunction2(){
    ms[numsegments(ms)]=(char*)calloc(1,100);
}

void randomfunction3(){
    ms[numsegments(ms)]=(char*)new frag(); //storing class as flat data in memory
    int segct=numsegments(ms); // get segments
    frag* init=(frag*)ms[--segct]; // subtract 1 from segment count before reading
    init->xyz=1; // set variable in class
}

int main(int argc, char *argv[]){
    ms=(char**)calloc(1,1000); //store up to 1000 indexes
    printf("Segments used so far: %d\n",numsegments(ms));
    randomfunction1();
    randomfunction2();
    randomfunction3();
    int total=numsegments(ms);
    printf("Segments used total: %d\n",numsegments(ms));
    int lastsegment=total-1;
    frag* y=(frag*)ms[lastsegment]; //convert to class
    printf("xyz in class = %d\n",y->xyz);
    for (int i=0;i<total;i++){free(ms[i]);} //free all segments
    free(ms);
    return 0;
}
#如果定义有配置#
#包括
#恩迪夫
#包括
#包括
静态字符**ms;
使用名称空间std;
类碎片{
公众:
int-xyz;
};
整数段(字符**segs){
返回strlen((const char*)segs)/sizeof(char*);
}
void随机函数1(){
ms[numsegments(ms)]=(char*)malloc(100);
}
void随机函数2(){
ms[numsegments(ms)]=(char*)calloc(1100);
}
void随机函数3(){
ms[numsegments(ms)]=(char*)new frag();//将类作为平面数据存储在内存中
int segct=numsegments(ms);//获取段
frag*init=(frag*)ms[--segct];//读取前从段计数中减去1
init->xyz=1;//在类中设置变量
}
int main(int argc,char*argv[]){
ms=(char**)calloc(11000);//最多存储1000个索引
printf(“到目前为止使用的段:%d\n”,numsegments(ms));
随机函数1();
随机函数2();
随机函数3();
int-total=numsegments(ms);
printf(“使用的段总数:%d\n”,numsegments(ms));
int lastsegment=总计-1;
frag*y=(frag*)ms[lastsegment];//转换为类
printf(“类中的xyz=%d\n”,y->xyz);

对于(int i=0;i您可以重载
运算符new

#include <stdlib.h>

int numOfHeapAllocations = 0;

void* operator new(size_t size)
{
    numOfHeapAllocations++;
    return malloc(size);
}
#包括
int numofheaplocations=0;
void*运算符新(大小\u t大小)
{
numOfHeapAllocations++;
返回malloc(大小);
}

只需将其放在主文件中的第一件事。

您看过valgrind吗?如果您只想计算分配的总字节数,可以使用valgrind。如果您想计算
malloc
调用的数量,那么最简单的方法就是为其编写包装器-请参阅。有一个有用的示例(特定于
glibc
)每次调用
malloc
时都会输出信息。您可以使用类似的代码来增加一个全局计数器。您有什么内核版本/glibc版本/distro?我建议您尝试一下,但它需要glibc debuginfo和kernel 3.5+(rhel内核在最低版本上可能有特殊补丁)。我查看了valgrind。它似乎只是显示分配的字节总数。但可能有某种特定的工具可以显示分配的字节数。抱歉,我不理解你的想法。主要问题是计算stl容器内进行了多少重新分配(向量、字符串等)。您的解决方案如何帮助做到这一点?我认为仅仅重载运算符“new”对我没有帮助(我认为标准stl分配器通常使用malloc分配内存,而不是使用placement new将对象放在那里。但是还有一个指向内存分配挂钩的链接,我可能可以尝试使用它们。