我发现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 |
+---------+---------------------------+
存储器没有完全使用,如果n
不16 * m + 8
,m
∈ℕ。浪费的一些存储空间是可以理解的,因为存储器对准当n
等于22,但它仍然应该被认为是浪费当等于n
16.在大多数的平台,最小存储器访问单元的大小是4个字节或8个字节,那么为什么GCC实现选择每增加16个字节。
开始每个分配都有开销。 'malloc'需要一些自己的数据结构的内存。看看例如[Malloc vs自定义分配器:Malloc有很多开销。为什么?](http://stackoverflow.com/questions/13064850/malloc-vs-custom-allocator-malloc-has-a-lot-of-overhead-why) – kaylum
令人惊讶的是,它分配32字节**也**即使结构是24字节,所以我猜想内存空间被**浪费**。 –
你为什么说它被浪费了?浪费意味着没有任何回报的成本,这在这里并不是真的。这是以某种方式管理内存的成本。 – kaylum