C 将控制信息与分配的内存一起存储。它是便携式的吗?

C 将控制信息与分配的内存一起存储。它是便携式的吗?,c,malloc,C,Malloc,非常简单地说,我们正在尝试编写一些分配例程(unsigned char类型),其中每个分配的块都有一些与之相关的控制信息。我们不打算编写一个完整的内存管理器,但有一些特定的要求 我们的控制结构示例 typedef struct _control_data { u8 is_segment; : : : struct _control_data* next; }control_data; 当用户为尺寸40调用alloc时,我们将分配 unsigned char*

非常简单地说,我们正在尝试编写一些分配例程(unsigned char类型),其中每个分配的块都有一些与之相关的控制信息。我们不打算编写一个完整的内存管理器,但有一些特定的要求

我们的控制结构示例

typedef struct _control_data
{
   u8 is_segment;
   :
   :
   :
   struct _control_data* next;
}control_data;
当用户为尺寸40调用alloc时,我们将分配

  unsigned char* data_ptr = (unsigned char*)malloc(sizeof(control_data) + size);
  return(&data_ptr[sizeof(control_data]);
稍后,用户将传递alloc期间返回的指针,我们希望访问控制信息

void do_some_processing(unsigned char* data_ptr)
   {
      struct control_data* c_ptr = (data_ptr - sizeof(control_data));
      c_ptr->is_segment = TRUE;
      c_ptr->next       = NULL;
   }

上述访问合法且可携带吗?

是的,应该可以,而且是一种常见的技术

有几点:

  • 使用指针算法可以发挥您的优势:

+1
将做正确的事情,但要简单得多。同样,让分配“类型化”也没有意义;让它返回
void*
,并让调用者使用
unsigned char*
指针来存储返回的值


更新:正如一条评论中指出的,这忽略了对齐(这感觉很安全,因为您说非控制数据是一个
无符号字符的数组
),这在一般情况下可能是一个问题。

另一个考虑事项(我不清楚OP的问题):如果所分配空间的用户具有对齐约束,则您可能必须将控制数据区大小四舍五入一点以满足这些约束。(例如,当使用MMX/SSE时。)是否保证用户只能使用
无符号字符访问您为其分配的区域?否则,由于对齐问题,您的代码可能无法移植。如果sizeof(control_data)%sizeof(void*)==0,您应该可以。
void * my_alloc(size_t size)
{
    control_data *cd = malloc(size + sizeof *cd);
    if(cd != NULL)
      return cd + 1;
    return NULL;
}