如何编写以下修改过的内存分配函数?

时间:2015-06-07 17:37:04

标签: c++

写一个对齐的malloc&自由函数,它取字节数和对齐字节(总是2的幂)并返回可被整数字节整除的内存地址。

Ex. align_malloc (1000,128);

it will return memory address multiple of 128 of the size 1000.

aligned_free(); 

it will free memory allocated by align_malloc.

为了分配功能,我编写了以下代码:

void * allocatemyfunc (size_t bytestobeallocated, size_t allignment)
{
  void * p1;
  void * p2;

  p1 = (void*)malloc(bytestobeallocated+allignment);
  if ( p1 == NULL )
    return 'error';
  else
  {
      size_t addr = bytestobeallocated + allignment;
      p2 = (void*)addr-(addr%allignment);
      return p2;
  }
}

这似乎是所有分配的合适解决方案。 (我可能错了,如果我是,请纠正我。)

如何编写alligned free函数? (这基本上可以释放所有分配的内存)

2 个答案:

答案 0 :(得分:1)

你的对齐malloc是错误的,你可以做这样的事情来对齐指针。

uint8_t* ptr = (uint8_t*)malloc(N + alignment);
....
uint8_t offset = alignment - ((uintptr_t)ptr % alignment);
ptr += offset;

现在你有一个指向前面有偏移字节的可用空间,你可以在那里存储偏移量。

*((uint8_t*)ptr - 1) = offset;

要释放ptr,你需要减去偏移量才能到达开头

uint8_t offset = *((uint8_t*)ptr - 1);
free((uint8_t*)ptr - offset);

答案 1 :(得分:0)

这不是一个重复的问题,但请在此处查看我的答案

What is the recommended way to align memory in C++11

该方法是通过在返回的内存之前引用内存来从返回的内存中找到块的开头