Quel est le bon remplacement pour posix_memalign dans Windows?

J’essaie actuellement de construire word2vec sous Windows. Mais il y a des problèmes avec la fonction posix_memalign() . Tout le monde suggère d’utiliser _aligned_malloc() , mais le nombre de parameters est différent. Alors, quel est le meilleur équivalent pour posix_memalign() dans Windows?

Merci tout le monde. Basé sur le code, je me trouve dans un repository et vos conseils, je comstack avec succès EXE. Voici le code que j’ai utilisé:

 #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 

MISE À JOUR :

On dirait que @alk suggère la meilleure solution pour ce problème:

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

_aligned_malloc() devrait être un remplacement décent pour posix_memalign() les arguments sont différents car posix_memalign() renvoie une erreur plutôt que de définir errno en cas d’échec, les autres sont identiques:

 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 } 

Devient:

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

si vous comparez la déclaration de possix_memalign :

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

avec la déclaration _aligned_malloc :

 void * _aligned_malloc(size_t size, size_t alignment); 

vous voyez que _aligned_malloc manque un void **memptr , mais renvoie void * place.

Si votre code était quelque chose comme ça:

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

maintenant ce sera (notez que x, y est maintenant y, x ):

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

Veillez à ce que la mémoire obtenue à partir de _aligned_malloc () soit libérée avec _aligned_free (), alors que posix_memalign () utilise simplement free (). Donc, vous voulez append quelque chose comme:

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