什么是在Windows中正确替换posix_memalign?

时间:2015-11-13 15:24:16

标签: c++ c windows memory posix

我目前正在尝试在Windows中构建word2vec。但是posix_memalign()函数存在问题。每个人都建议使用_aligned_malloc(),但参数的数量不同。那么Windows中posix_memalign()的最佳等价物是什么?

4 个答案:

答案 0 :(得分:5)

_aligned_malloc()应该是posix_memalign()参数不同的正确替代,因为posix_memalign()会返回错误而不是在失败时设置errno,其他它们是相同的:

void* ptr = NULL;
int error = posix_memalign(&ptr, 16, 1024);
if (error != 0) {
  // OMG: it failed!, error is either EINVAL or ENOMEM, errno is indeterminate
}

变为:

void* ptr = _aligned_malloc(1024, 16);
if (!ptr) {
  // OMG: it failed! error is stored in errno.
}

答案 1 :(得分:5)

谢谢大家。基于代码我喜欢在一些存储库和你的建议我成功建立EXE。这里是我使用的代码:

#ifdef _WIN32
static int check_align(size_t align)
{
    for (size_t i = sizeof(void *); i != 0; i *= 2)
    if (align == i)
        return 0;
    return EINVAL;
}

int posix_memalign(void **ptr, size_t align, size_t size)
{
    if (check_align(align))
        return EINVAL;

    int saved_errno = errno;
    void *p = _aligned_malloc(size, align);
    if (p == NULL)
    {
        errno = saved_errno;
        return ENOMEM;
    }

    *ptr = p;
    return 0;
}
#endif

更新

看起来@alk建议解决这个问题的最佳方法:

#define posix_memalign(p, a, s) (((*(p)) = _aligned_malloc((s), (a))), *(p) ?0 :errno)

答案 2 :(得分:2)

如果您比较possix_memalign声明:

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

_aligned_malloc声明:

void * _aligned_malloc(size_t size, size_t alignment);

您发现_aligned_malloc缺少void **memptr参数,但它会返回void *

如果您的代码是这样的:

void * mem;
posix_memalign(&mem, x, y);

现在会(注意x, y现在是y, x):

void * mem;
mem = _aligned_malloc(y, x);

答案 3 :(得分:0)

请注意,从_aligned_malloc()获取的内存必须使用_aligned_free()释放,而posix_memalign()只使用常规的free()。所以你想要添加如下内容:

#ifdef _WIN32
#define posix_memalign_free _aligned_free
#else
#define posix_memalign_free free
#endif