Tag: 内存管理

内存/速度问题的一般策略

我有一个c ++代码,它运行大约200个ASCII文件,进行一些基本的数据处理,并输出一个带有(基本上)所有数据的ASCII文件。 该程序一开始运行得非常快,然后在一段时间内急剧减速,可能会逐渐减慢,然后以相当缓慢的速度进行。 即它在大约5秒钟内通过前~80个文件,在大约50秒内完成约200个文件。 每个文件基本相同。 我正在寻找有关如何追踪问题或内存泄漏的建议。 更多细节:首先我会在程序开头fopen(FILE * outputFile,“w”),最后是fclose()。 前~40个文件大约需要4秒钟; 然后大约1.5分钟~200个文件。 我想也许输出文件堵塞了内存,所以我在每次迭代时(即每次打开一个新文件时)将代码更改为fopen(outputFile,“a”),每次关闭输入文件时fclose()。如上所述,这将性能提高到约50秒。 看起来很奇怪,这个“修复”会有明显的帮助,但并非完全如此。 此外,我不是动态分配任何内存(没有调用’新’或’删除’或’免费’或其他什么)….所以我甚至不知道我怎么会有内存泄漏。 任何帮助,将不胜感激! 谢谢! 码: vector dirCon; // Uses boost::filesystem to store every file in directory bool retVal = FileSystem::getDirectoryContents(HOME_DIR+HISTORY_DIR, &dirCon, 2); int counter = 0; for(int i = 0; i < dirCon.size(); i++) { // Create output file FILE *outFile; string outputFileName […]

现代计算机的堆栈和堆空间

用C语言编写时,如何在启动程序时判断内存中可用的堆栈空间是多少? 堆空间怎么样? 如何判断程序执行期间使用了多少内存?

从C中的函数内部分配字符串数组

我有一个函数扫描文件并返回行数和字符串数组中的行,我的函数如下所示: int load_lines(char* _file, char** _array){ FILE *infile; char line_buffer[BUFSIZ]; char line_number; infile = fopen(_file, “r”); ine_number = 0; while (fgets(line_buffer, sizeof(line_buffer), infile)) ++line_number; fclose(infile); _array = malloc (line_number * sizeof(char*)); infile = fopen(_file, “r”); line_number = 0; while (fgets(line_buffer, sizeof(line_buffer), infile)) { _array[line_number] = malloc(strlen(line_buffer) + 1); strcpy(_array[line_number], line_buffer); //a printf on _array[line_number] works […]

“pragma pack 1”可以帮助避免堆碎片吗?

在我的程序中,我看到一些居民规模增加。 我想这是因为堆碎片。 所以我打算使用#pragma pack 1 。 它会减少堆碎片吗? 它会有其他一些开销吗? 我要不要去吧?

malloc分配的内存保护标志是什么?

根据这个线程 , malloc分配的malloc至少有PROT_READ | PROT_EXEC PROT_EXEC,否则无法执行包含的function。 man malloc没有提及任何关于保护的问题。

如何将四面体树结构复制到CUDA设备内存?

如果我想将以下结构TetrahedronStruct移动到CUDA设备内存,我该怎么办? struct TetrahedronStruct { int index; int region; TriangleFaces Faces[4]; Vertex Vertices[4]; struct TetrahedronStruct *adjTetrahedrons[4]; }; typedef struct { long double Nx, Ny, Nz; long double d; Vertex V[3]; } TriangleFaces; typedef struct { long double x, y, z; } Vertex; 细节: 提供网格细节(节点数,四面体,坐标和区域)。 树的创建是在for循环中完成的。 基本上,每个面都以其坐标和邻接相应地定位和布置在树中。 在CUDA设备中,我需要使用此结构在媒体上叠加,以模拟粒子如何穿过该媒体。 百万粒子中的每一粒都从四面体移动到四面体(每个四面体具有它所在的介质的特性)。

可以在C中调用free()失败吗?

可以以任何方式调用free()吗? 例如: free(NULL);

Malloc – >分配了多少内存?

# include # include # include # include int main () { char * buffer; buffer = malloc (2); if (buffer == NULL){ printf(“big errors”); } strcpy(buffer, “hello”); printf(“buffer is %s\n”, buffer); free(buffer); return 0; } 我为指针/ char buffer分配了2个字节的内存,但是如果我为它分配C风格的字符串hello ,它仍会打印整个字符串,而不会给我任何错误。 为什么编译器没有给我一个错误,告诉我没有足够的内存分配? 我读了几个问题,询问如何检查malloc实际分配的内存量,但我没有找到具体的答案。 free函数不应该确切地知道buffer分配了多少内存吗?

在动态分配的2Darrays上使用realloc()是个好主意吗?

我主要对缩小这样一个数组的可行性感兴趣。 我正在开发一个项目,我在其中使用单个malloc()调用来创建各个中等大小的2D数组。 (每个只有几十个MiB,最大的。)事情是,在其中一个arrays的生命周期中,其内容大小缩小(超过一半)。 显然,我可以在程序的生命周期中单独保留数组大小。 (它只有一个具有GiB RAM的系统上的x MiB。)但是,我们正在谈论超过一半的分配空间在程序终止之前就被废弃了,并且,由于我使用的方式的性质数组中,所有幸存数据都保存在一组连续的行中(在块的开头)。 如果我真的不需要它,那么抓住所有RAM似乎是浪费。 虽然我知道realloc()可用于缩小动态创建的数组,但2D数组​​更复杂。 我想我理解它的内存布局(因为我实现了构造它的函数),但这推动了我对语言及其编译器工作的理解的极限。 显然,我将不得不处理行(并处理行指针),而不仅仅是字节,但我不知道所有这些的结果是多么可预测。 并且,是的,我需要使用单个malloc()创建数组。 有问题的对象有几百万行。 我尝试分别使用一个循环到malloc()每一行,但程序总是冻结在大约100,000 malloc()s。 对于后台,我用来构造这些数组的源代码如下: char ** alloc_2d_arr(int cnum, int rnum) { /* ((bytes for row pointers + (bytes for data)) */ char **mtx = malloc(rnum * sizeof (char *) + rnum * cnum * sizeof (char)); /* Initialize each row pointer to the […]

C指针和内存分配:Realloc数组和指针传递

对于那些有C经验的人来说,这将是一个简单的内存分配/引用问题: 这是我的数据结构: struct configsection { char *name; unsigned int numopts; configoption *options; }; typedef struct configsection configsection; struct configfile { unsigned int numsections; configsection *sections; }; typedef struct configfile configfile; 以下是初始化configsection或configfile以及将配置文件添加到配置文件的例程: // Initialize a configfile structure (0 sections) void init_file(configfile *cf) { cf = malloc(sizeof(configfile)); cf->numsections = 0; } // Initialize a configsection structure with […]