while(count < 30000000){
malloc(24);
count++;
}
Run Code Online (Sandbox Code Playgroud)
上面的代码在我用gcc -O0编译的计算机上运行大约170毫秒.但是,使用-Ox进行编译,其中x> 0,优化器巧妙地指出所请求的内存永远不会被使用,因此它被排除在优化的可执行文件之外.它是如何做到的?
我正在尝试编写一个与dlmalloc相当的内存分配器,它是glibc中使用的malloc.dlmalloc是一个具有块拆分的最佳匹配器,它在将块再次合并为大块之前保留了最近使用的块池.我正在写的分配器首先适合它.
我的问题有两个:(1)我的代码的测试时间与glibc malloc相比是非常不规则的;(2)有些日子我的代码的平均运行时间将是3到4倍; (2)并不是什么大问题,但我想理解为什么glibc malloc不会以同样的方式受到影响.此帖还显示了malloc和我的代码之间(1)中描述的行为示例.有时,一批1000次测试的平均时间远远高于malloc的时间(上面的问题(2)),有时平均值是相同的.但是,对我的代码进行一批测试的测试时间总是非常不规则(上面的问题(1)); 意味着在一批测试中有时间跳跃到平均值的20倍,并且这些跳跃散布在其他常规(接近平均)时间内.glibc malloc不这样做.
我正在编写的代码如下.
===================================
/* represent an allocated/unallocated block of memory */
struct Block {
/* previous allocated or unallocated block needed for consolidation but not used in allocation */
Block* prev;
/* 1 if allocated and 0 if not */
unsigned int tagh;
/* previous unallocated block */
Block* prev_free;
/* next unallocated block */
Block* next_free;
/* size of current block */
unsigned int size;
};
#define CACHE_SZ 120000000
/* array to be …Run Code Online (Sandbox Code Playgroud)