Tag: 内存

如何查找malloc调用实际消耗了多少内存?

如果我打电话: char *myChar = (char *)malloc(sizeof(char)); 我可能会使用超过1个字节的内存,因为malloc可能会自己使用一些内存来跟踪堆中的空闲块,并且总是可以通过始终沿着某些边界对齐分配来节省一些内存。 我的问题是 :有没有办法找出特定的malloc调用真正耗尽了多少内存,包括有效的对齐成本,以及malloc / free使用的开销? 为了清楚起见,我并没有要求在调用malloc之后找出指针指向的malloc 。 相反,我正在调试一个使用大量内存的程序,我想知道代码的哪些部分正在分配多少内存。 我希望能够使内部记忆会计与top报告的数字非常接近。 理想情况下,我希望能够以per malloc -call为基础以编程方式执行此操作,而不是在检查点获取摘要。

为什么赞成数据结构对齐?

结构的每个成员的类型通常具有默认对齐,即每个结构成员在预定边界上对齐。 因此,填充是在以下wiki示例中执行的: struct MixedData { char Data1; short Data2; int Data3; char Data4; }; struct MixedData /* After compilation in 32-bit x86 machine */ { char Data1; /* 1 byte */ /* 1 byte for the following ‘short’ to be aligned on a 2 byte boundary assuming that the address where structure begins is an […]

为什么mstats和malloc_zone_statistics在免费后没有显示恢复的内存?

我正在尝试编写一些unit testing来检查内存是否已被释放 – 以检查内存泄漏 – 在OS X(10.9 Mavericks)上。 我正在尝试使用mstats()和malloc_zone_statistics()来发现我需要的信息。 但似乎他们没有显示内存被释放(参见下面的示例输出…在调用free()后内存使用率不会改变) 我怀疑这与堆管理有关,而不是与这些函数的问题有关。 我认为堆不释放释放的内存,也许它可以重用它而不需要删除和添加块的开销。 有没有办法告诉堆释放释放的块? 要更积极还是关闭优化? 我只是错误地使用mstats()或malloc_zone_statistics()吗? 更新:找到的解决方案……在底部提供…… 这是我的测试程序的输出: === Initial conditions === in use: 23584, allocated: 9437184, blocks: 320 SimpleLeaker(19583,0x7fff7b2a2310) malloc: total: 9437184, used: 23584, free: 9413600 === Before allocation === in use: 23584, allocated: 9437184, blocks: 320 SimpleLeaker(19583,0x7fff7b2a2310) malloc: total: 9437184, used: 23584, free: 9413600 […]

如何在内存中存储分子?

我想将分子存储在记忆中。 这些可以是简单的分子: Methane (CH4) CH bond-length: 108.7 pm HH angle: 109 degrees 但也有更复杂的分子,如扑热息痛(C8H9NO2): 如何将分子存储在内存中,包括所有键长和角度? 将atom-structs存储在数组中的好主意? 或者,还有更好的方法?

其他function/方法定义会增加程序的内存占用吗?

在C ++中,定义未使用的其他方法或函数是否会导致更大的内存占用或更慢的执行速度? 基本上,我在类中有几个实用程序调试方法,这些方法都不是正常使用类所必需的。 如果它们从未被使用过,这些定义是否仍然存在,它会在内存占用或速度方面产生影响吗? 例如: class myClass { public: //Something the user of this class would use int doSomething() {…} //Something used solely to make sure I wrote the class properly bool isClassValid() {…} }; … myClass classInstance(); myClass.doSomething();

C编程动态初始化2D数组

我在这里做一些愚蠢的事情,我无法确切地指出: void init_data(double **data, int dim_x, int dim_y) { int i,j,k; data = (double **) malloc(sizeof(double) * dim_x); for (k = 0; k < dim_y; k++) { data[k] = (double *) malloc(sizeof(double) * dim_y); } for (i = 0; i < dim_x; i++) { for (j = 0; j < dim_y; j++) { data[i][j] = […]

复制期间的字节交换

我需要在复制到另一个数组期间有效地交换数组的字节顺序。 源数组属于某种类型; char,short或int所以所需的字节交换是明确的,并且将根据该类型。 我的计划是使用多遍字节副本(简称2,int为4,…)来做到这一点。 但是有没有预先存在的“memcpy_swap_16 / 32/64”函数或库? 也许在用于BGR / RGB图像处理的图像处理中。 编辑 我知道如何交换单个值的字节,这不是问题。 我希望在我要执行的副本中执行此过程。 例如,如果我有一个数组或小端4字节整数,我可以通过执行4个字节副本进行交换,初始偏移量为0,1,2和3,步幅为4.但是可能有更好的方法,甚至可能单独读取每个4字节整数并使用字节交换内在函数_byteswap_ushort,_byteswap_ulong和_byteswap_uint64会更快。 但我怀疑必须有现有的function来进行这种处理。 编辑2 刚发现这个,这可能是SSE的一个有用的基础,尽管它的真实内存带宽可能会浪费时间。 从RGB到BGRA的快速矢量化转换

malloc()/ free()的对齐限制

较早的K&R(第2版)和其他我读过的C语言文本讨论了malloc()和free()风格的动态内存分配器的实现,通常也提到了一些关于数据类型对齐限制的内容。 显然,某些计算机硬件体系结构(CPU,寄存器和内存访问)限制了如何存储和处理某些值类型。 例如,可能要求必须从4的倍数的地址开始存储4字节( long )整数。 主要平台(英特尔和AMD,SPARC,Alpha)对内存分配和内存访问有什么限制(如果有的话),还是可以安全地忽略在特定地址边界上对齐内存分配?

如何避免高内存使用率应用程序中的内存不足? C / C ++

我编写了一个转换器,它接受openstreetmap xml文件并将它们转换为二进制运行时渲染格式,通常约为原始大小的10%。 输入文件大小通常为3GB或更大。 输入文件不会一次性加载到内存中,而是在收集点和多边形时进行流式传输,然后在它们上运行bsp并输出文件。 最近在较大的文件上,它耗尽内存并死掉(有问题的一个有1400万个点和100万个多边形)。 通常我的程序在发生这种情况时使用大约1gb到1.2 gb的ram。 我已经尝试将虚拟内存从2增加到8GB(在XP上),但这种改变没有任何效果。 此外,由于此代码是开源的,我希望无论可用的ram(尽管速度较慢)都可以使用它,它可以在Windows,Linux和Mac上运行。 我可以使用哪些技术来避免内存不足? 处理较小子集中的数据,然后合并最终结果? 使用我自己的虚拟内存类型的处理程序? 还有其他想法吗?

为什么在堆栈中为局部变量分配的内存多于C ++中所需的内存?

我正在阅读缓冲区溢出。 我发现有关堆栈上局部变量的内存分配的一个奇怪的事情 int f1 () { char string1[12]; char string2[4]; } 这里分配发生在堆栈上。 现在,在GCC中, string2被分配了4个字节,但是如果我声明除了2的幂(最多16个)之外,那么它由编译器分配16个字节。 这意味着如果我在3,5,6,7,….,15个字节中分配string2,那么它由编译器分配16个字节,但如果我分配2的幂,如1,2,4,8 ……然后它被分配完全相同的大小。 如果我分配超过16个字节(不是2的幂),那么它分配32个字节(我估计高达32个字节)。 而在Visual Studio中,如果我分配1个字节,则分配9个字节,如果从2-4个字节分配,则分配12个字节,如果从5-8个字节开始,则编译器分配16个字节。 任何人都知道为什么这样的任务??? Atleast在Visual Studio中,如果有缓冲区溢出,我会收到调试错误,但在gcc中没有任何反应。 GCC仅在发生过大的溢出时才提供分段故障。