使用char数组填充C中的struct

问题描述 投票:0回答:2

我正在用C编写一个简单的解释器,我不想处理内存管理,因此我正在编写一个简单的内存池来跟踪和减少malloc和free的数量。

typedef struct object {

    Type type;
    char data[128];
    struct object* next;

} Object;

typedef struct pool {

    Object* head;
    unsigned int used;
    Object* blocks;

} Pool;

如您所见,我的内存池当前只是“对象”的链接列表,每个对象的大小为128字节。

我的init和malloc函数如下:

#define BLOCK_COUNT 256

void* mp_init() {

    Pool* mp = malloc(1 * sizeof(Pool));

    mp->blocks = malloc(BLOCK_COUNT * sizeof(Object));

    mp->head = mp->blocks;
    mp->blocks->next = NULL;
    mp->used = 0;

    return mp;

}

void* mp_malloc(Pool* mp) {

    Object* obj = NULL;
    obj = (mp->blocks + mp->used);
    obj->next = (mp->blocks + (mp->used + 1) );
    obj->next->next = NULL;

    mp->used++;

    return obj;

}

我正在使用char data[128]来强制我的所有对象的大小为128字节,我的malloc函数返回每个对象的地址,并在这128个字节中存储我想要的任何内容。这是不好的做法吗?使用数组来增加结构的大小似乎很奇怪。

c memory memory-management
2个回答
0
投票

我会考虑你的代码不好的做法。

  1. 如果您有一个数组(块),则不需要链接列表。
  2. 在init方法中调用malloc(BLOCK_COUNT * sizeof(Object));将分配所有块。这将导致程序在开始时分配所有需要的内存,如果您不确切知道需要多少内存,这可能会浪费内存。
  3. 您仍然需要管理池中的内存,因此没有必要。

你可能想要做的是写一个垃圾收集器。然而,这不是微不足道的,需要很长时间来解释。

如果您不想进行内存管理,我建议您使用其他语言。

否则你可能正在寻找的是具有以下形式的“变体”数组:

enum type {
    TYPE_1,
    ...
};

struct Object {
    enum type t;
    union {
       type_1 t1;
       ...
    };
};

0
投票

如果满足以下条件,可以在初始化期间分配应用程序所需的所有内存:

  1. 由于运行时内存不足,您不希望malloc调用失败。 (这可能是一种罕见的情况,但您的应用程序应该足够强大以处理它)
  2. 您的应用程序无法容忍系统调用(如malloc和free)引入的延迟。

是否是一种好的做法取决于您正在使用的应用程序类型。从你发布的代码片段我想提出几点意见:

  1. 当然,您必须实现自己的mp_free调用以将释放的块返回到内存池。
  2. 如果您的应用程序释放列表中间的块,则mp_malloc应该能够重用它。
  3. 如果所有线程都访问相同的内存池,则需要确保对mp_malloc和mp_free的调用是线程安全的。

简而言之,只有当您的内存管理器足够强大以处理所有上述场景时,实现您自己的内存管理模型才是一个好习惯。请记住,在大型应用程序中,内存管理器中的错误可能很难检测到。

© www.soinside.com 2019 - 2024. All rights reserved.