2017-10-17 40 views
1

我一直在寻找到一些内存管理(pool + malloc + free)实现使用链表,我发现,在大部分时间里的每一个节点是这样的:为什么接近节点顶部的下一个指针?

typedef struct node{ 
int usedSize; 
node* next; 
char mem[100]; 
} 

然后free(ptr)必须是:

free(void* ptr){ 
node* item = (node*)((char*)ptr - sizeof(node*) - sizeof(int)); 
\\some code to put the "item" back to the pool 
} 

我的问题是这样的: 为什么我们不该把char mem[100];在结构的开头,以避免“指针操作”?

结果是:

typedef struct node{ 
char mem[100]; // moved to the beginning 
int usedSize; 
node* next; 
} 

,然后free(ptr)简单:

free(void* ptr){ 
node* item = (node*)((char*)ptr); 
\\some code to put "item" back to the pool 
} 

感谢。

+1

如果所有分配完全是100个字节,那么这将工作正常。但是如果分配的大小不同,你如何找到分配的大小?在分配之前立即设置大小使其变得简单。 – rici

+0

thatnks @rici但我不需要找到它,我可以使用 node-> usedSize 我错过了什么? – mvk

+0

谢谢@jxh回答(3),我不知道。 – mvk

回答

1
  1. 该指针操作并不特别复杂。它相当于编译时间常数的递减量。正如在评论中所指出,它实际上应:

    node* item = (node*)((char*)ptr - offsetof(struct node, mem)); 
    
  2. 配售存储器高于头允许存储器通过一个柔性阵列构件来表示。灵活的阵列成员只能占据结构的最后位置。评论中也指出了这一点。

    typedef struct node { 
        int usedSize; 
        node* next; 
        char mem[]; 
    } node; 
    
  3. 如果存储器的尺寸是大的,跳跃在阵列上以到达下一指针将可能刷新数据的高速缓存行加载簿记数据。然而,从数组向后短暂跳转可能会访问已经加载到缓存中的数据。

相关问题