内存分配 - 4个地址的多个地址

时间:2011-03-12 04:48:25

标签: c memory memory-management

我需要分配4字节内存,分配的内存地址应该是4的倍数。 例如:400,404,408,40c

如果我使用任何内存分配功能,我会收到可用的内存,地址不一定是4的倍数。

所以任何人都可以建议实现这种设计。

3 个答案:

答案 0 :(得分:5)

在Microsoft C / C ++编译器中,您可以使用_aligned_malloc和Linux posix_memalign

<强> MSVC:

ptr = _aligned_malloc(4, 4);

签名:

void * _aligned_malloc(size_t size, size_t alignment);

<强> Linux的:

posix_memalign(&ptr, 4, 4); // returns 0 if successful

签名(与MSFT相比,注释顺序相反):

int posix_memalign(void **memptr, size_t alignment, size_t size);

答案 1 :(得分:2)

为您的分配金额添加3。分配内存。如果返回的地址不是4的倍数,则将其四舍五入直到它为止。 (你最需要整理的是3,这就是为什么你要提前填写你的分配。)

当您释放内存时,请记住释放原始地址,而不是舍入值。

答案 2 :(得分:0)

Guy Sirton 给出了正确的答案,但它含糊不清,可能导致潜在的错误。
其中的示例显示了 size alignment 的值4 但_aligned_malloc()posix_memalign()的实际论点是相反的:

  • _aligned_malloc( size_t size, size_t alignment )
  • posix_memalign(void **memptr, size_t alignment, size_t size)

更好的例子是非对称的,例如:

size_t alignment = 16; // Must be a power of 2
size_t size = 10;      // Not necessarily a power if 2

#ifdef _MSC_VER
  ptr = _aligned_malloc(size, alignment);
#else
  posix_memalign(&ptr, alignment, size); 
#endif