2016-01-31 39 views
0

我发现malloc()分配的内存空间比我想要的要多。为什么malloc分配的内存空间比我想要的要多?

struct { void *ptr; int var; } msg; // 16 bytes (checked by sizeof()) 

for (int i = 0; i < 100000000; i++) 
    malloc(sizeof(msg)); 

作为上述代码,malloc()实际上分配每个函数调用(由top计算)32个字节,但valgrind显示每呼叫只有16字节确实。

为什么malloc分配的内存空间比我所要求的要多,以及如何强制malloc()不要浪费太多内存空间?

令人惊讶的是,它分配32个字节即使结构是24字节,所以我想内存空间被浪费了。我不确定malloc()是否应该分配32个字节的倍数。如果这是真的,那么内存空间就会被浪费掉。

编辑:

我测试过的其他情形。

+---------+---------------------------+ 
| n | memory usage of malloc(n) | 
+---------+---------------------------+ 
| 1 ~ 24 |   32 bytes   | 
+---------+---------------------------+ 
| 25 ~ 40 |   48 bytes   | 
+---------+---------------------------+ 
| 41 ~ 56 |   64 bytes   | 
+---------+---------------------------+ 

存储器没有完全使用,如果n16 * m + 8m∈ℕ。浪费的一些存储空间是可以理解的,因为存储器对准当n等于22,但它仍然应该被认为是浪费等于n 16.在大多数的平台,最小存储器访问单元的大小是4个字节或8个字节,那么为什么GCC实现选择每增加16个字节。

+2

开始每个分配都有开销。 'malloc'需要一些自己的数据结构的内存。看看例如[Malloc vs自定义分配器:Malloc有很多开销。为什么?](http://stackoverflow.com/questions/13064850/malloc-vs-custom-allocator-malloc-has-a-lot-of-overhead-why) – kaylum

+0

令人惊讶的是,它分配32字节**也**即使结构是24字节,所以我猜想内存空间被**浪费**。 –

+0

你为什么说它被浪费了?浪费意味着没有任何回报的成本,这在这里并不是真的。这是以某种方式管理内存的成本。 – kaylum

回答

1

任何额外的内存,如果有的话,通过malloc()calloc()等分配是系统的实现定义方面,而不是由C.

指定

检查你的编译器的规格来决定的原因。通常用于内存管理。

要强制进行不同的分配方案,重新写malloc()或使用自己的内存分配函数。

1

malloc()具有非常显着的运行时间间接费用。 GNU C库使用基于dlmalloc(“Doug Lea's Malloc”)的ptmalloc

堆上的内存被分配为“块”,8-byte对齐的数据结构,其中包含头和可用内存。分配的内存包含块大小和使用率标志的开销816 byte。未分配的块也将指向其他空闲块的指针存储在可用空间区域中,使得最小块大小为24 bytes

未分配的内存被分组到类似大小的“容器”中,通过使用块的双链表(存储在块内的未分配空间中的指针)来实现。

对于低于256 bytes(“smallbin”请求)的请求,使用简单的两个功率最佳配合分配器。如果该垃圾箱中没有空闲块,则来自下一个最高垃圾箱的块被分成两部分。

你可以阅读更多关于它here

+0

再加上1为你的信息,但这仍然不能减少我的代码中的内存使用情况。 –

0

多余字节分配即开销是实现特定的,在实现内存管理器分配作为是必要的内部跟踪/看家目的尽可能多的内存。内存空间不被视为浪费。 您的关注是真实的,特别是如果您正在查看数以百万计的小分配 - 这将导致大量堆内存碎片,当然还有巨大的开销。因此,我可以考虑两种选择 - 编写堆分配器或更好地使用由其他人编写/测试/共享的内存管理器 - 从Facebook的jemalloc或Google的tcmalloc -

+0

我编辑我的问题来解释为什么我认为内存空间被视为被浪费的原因。 –

相关问题