如何使用malloc()完成字节对齐?

时间:2015-08-31 09:19:45

标签: c

我目前正在阅读用于对齐内存分配和空闲分配内存的程序。这是C代码:

/**
 * Aligned memory allocation
 * param[in] size Bytes to be allocated
 * param[in] alignment Alignment bytes
 * return Address of allocated memory
 */
inline void* _al_malloc(size_t size, size_t alignemt)
{
    size_t a = alignment - 1;
    size_t word_length = sizeof(void*);
    void* raw = malloc(word_length + size + a);
    if (!raw)
    {
        return 0;
    }
    void* ptr = (void*)((size_t(raw) + word_length + a) & ~a);
    *((void**)ptr - 1) = raw;
    return ptr;
}



/**
 * Free allocated memory
 */
inline void _al_free(void * ptr)
{
    if (!ptr)
    {
        return;
    }
    void* raw = *((void**)ptr - 1);
    free(raw);
}

这些操作如何确保字节对齐的内存?

1 个答案:

答案 0 :(得分:3)

它分配额外的内存,然后移动返回指针的起始地址,使其正确对齐(可能不使用几个字节)。

更详细:

size_t a = alignment - 1;

如果alignment是2的幂,则这将给出所需的额外字节数和对齐指针中不允许的地址位掩码。

例如,如果alignment是8,我们可能需要分配7个额外的字节,以确保其中一个字节在8处对齐。

size_t word_length = sizeof(void*);

计算额外指针的大小(稍后free需要)。

void* raw = malloc(word_length + size + a);

分配所需的内存块+指针大小+我们可能需要用于对齐的额外字节。

if (!raw)
{
    return 0;
}

如果失败,则返回空指针。

void* ptr = (void*)((size_t(raw) + word_length + a) & ~a);

现在获取一个新指针,它是原始指针+用于保存的空间+正确对齐所需的字节数。

*((void**)ptr - 1) = raw;

同时保存malloc的原始指针,因为free稍后需要它。

return ptr;

完成。