gpt4 book ai didi

c - 为什么下一个指针靠近节点的顶部?

转载 作者:太空宇宙 更新时间:2023-11-04 03:20:37 24 4
gpt4 key购买 nike

我正在研究一些使用链表的内存管理(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. 指针操作并不是特别复杂。它相当于编译时间常数的递减。如评论中所述,它实际上应该是:

    node* item = (node*)((char*)ptr - offsetof(struct node, mem));
  2. 将该 header 放在内存之上,允许内存由灵活的数组成员表示。灵活的数组成员只能占据结构的最后一个位置。评论中也指出了这一点。

    typedef struct node {
    int usedSize;
    node* next;
    char mem[];
    } node;
  3. 如果内存很大,跳过数组到达下一个指针可能会刷新数据缓存行以加载簿记数据。但是,从数组向后的短跳转可能会访问已经加载到缓存中的数据。

关于c - 为什么下一个指针靠近节点的顶部?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46800209/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com