c – 对齐指针

我想对齐指针p,使得p = a(模b).大多数情况下,对于SIMD对齐,a = 0和b = 32或64,但是当我想微调我的算法以获得缓存关联性时,我可能还需要a = 64和b = 128.

> std :: align不接受任何2的权力作为对象.它将在C 17中修复,但现在没用
> __mm_malloc / __ free不如我想要的那么便携

到目前为止,我最好的解决方案是将指针强制转换为std :: uintptr_t,并对整数使用模运算来移动指针.不幸的是,它不可移植,因为投射指向std :: uintptr_t的指针不是“允许的”.但它适用于我迄今为止尝试过的所有平台.

这样的代码会在什么样的平台上破坏?

最佳答案 你可能会寻找这样的东西:

inline size_t AlignHi(size_t size, size_t align)
{
    return (size + align - 1) & ~(align - 1);
}

inline void * Allocate(size_t size, size_t align)
{
#if defined(_MSC_VER) 
    return _aligned_malloc(size, align);
#elif defined(__GNUC__)
    align = AlignHi(align, sizeof(void*));
    size = AlignHi(size, align);
    void * ptr;
    int result = ::posix_memalign(&ptr, align, size);
    return result ? NULL : ptr;
#else
    return malloc(size);
#endif
}

inline void Free(void * p)
{
#if defined(_MSC_VER) 
    _aligned_free(p);
#else
    free(p);
#endif
}
点赞