【问题标题】:Add metadata to memory将元数据添加到内存
【发布时间】:2013-12-12 03:07:51
【问题描述】:

我正在尝试创建一个简单的函数来在堆上为给定大小的对象分配空间,并为内部使用的一些额外元数据分配空间。

分配大小x时我想分步做的事情:

  1. 使用 malloc 分配,使用 malloc 分配 x + sizeof(struct metadata)。结果 => start_adr
  2. 将元数据分配给 start_adr 中的第一个字节
  3. 返回指向 start_adr + sizeof(struct metadata) 的指针

第 2 步有问题。如何将参数 meta 的值分配给 start_adr 中的第一个字节?

struct metadata{
    unsigned char data;
};

void *myMalloc(int size, unsigned char meta){
    int meta_sz = sizeof(struct metadata);      // size of metadata
    void *ptr = (void *)malloc(meta_sz + size); //pointer to our space in memory

    //Magic code for assigning meta here

    return (void *)(ptr + meta_sz); // return memory slot (with meta exluded)
}

【问题讨论】:

  • 小心对齐。照原样,您正在做的事情将无法移植(并且在它起作用时可能会产生非常糟糕的性能影响)。

标签: c memory-management


【解决方案1】:

您是否遇到了一些特定的错误?还是您只是不知道该怎么做?

如果我理解正确的话应该这么简单:

struct meta_data * foo = ptr;
foo->data = meta;

return ptr+sizeof(struct meta_data);

仅读取返回的 ptr:

struct meta_data * foo = ptr-sizeof(struct meta_data);
printf("%hhu\n", foo->data);

释放时记住:

void myFree(void * ptr) {
    void * malloced_ptr = ptr-sizeof(struct meta_data);
    free(malloced_ptr);
}

【讨论】:

  • 谢谢你,这很好!我将如何做相反的事情(即阅读元数据)?
  • @AntonGildebrand 这更难。您需要保留返回的初始 ptr malloc(),或保留分配内存的长度,因为,您需要知道 ptr 才能读取 meta 并且您需要知道它以便以后可以free()内存。
  • 即使元数据始终是地址的第一个字节,我是否需要知道这一点?
  • @AntonGildebrand 我已经用更多信息更新了我的答案。我错误地阅读了您最初的问题,即您对返回的指针做了什么数学运算,它应该很容易阅读,并且以后可以从您拥有的信息中解放出来。我还更新了答案的第一部分以使用您的struct meta_data
【解决方案2】:

在分配的内存空间中,它的地址是指向第一个字节的指针。因此,您只需将所需的元数据分配给它并返回它。此外,没有必要转换 malloc 返回(实际上它是 void*,所以在这种情况下它无论如何都是没有意义的)。请注意,这是有效的,因为 meta 是无符号字符(即 1 个字节)。在其他情况下,您需要将 ptr 转换为 struct metadata*(例如,如果它有更多成员)。 return之前也不需要强制转换

void *myMalloc(int size, unsigned char meta){ int meta_sz = sizeof(结构元数据); // 元数据的大小 void *ptr = (void *)malloc(meta_sz + size); //指向我们在内存中的空间

*ptr = meta;

return (ptr + meta_sz); // return memory slot (with meta exluded)

}

请注意,这可能是一种不好的编程习惯,因为它与指向已分配内存空间的指针是指向它的第一个字节的指针的约定相矛盾。如果您使用指向实际元数据的指针会更好,因为知道分配空间中的第一个字节是元数据。

【讨论】:

    猜你喜欢
    • 2013-09-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-28
    • 2021-11-17
    • 2013-01-03
    • 2018-06-17
    • 2020-04-05
    • 1970-01-01
    相关资源
    最近更新 更多