我正在编写一个Python模块来在O_DIRECT上下文中执行IO.O_DIRECT的一个限制是你必须读入对应于2.4和2.5内核的4096字节边界的缓冲区,2.6及以上将接受512的任意倍数.
对此明显的内存分配候选是 posix_memalign(void **memptr, size_t alignment, size_t size)
在我的代码中,我分配了一个像这样的区域:
char *buffer = NULL;
int mem_ret = posix_memalign((void**)&buffer, alignment, size);
if (!buffer) {
PyErr_NoMemory();
return NULL;
}
/* I do some stuff here */
free(buffer);
Run Code Online (Sandbox Code Playgroud)
当我用python3.2编译和导入模块时,这个(以及未示出的模块的其余部分)工作正常.
当我尝试使用python2.7(我想保持兼容性)时,它会抛出PyErr_NoMemory异常,并mem_ret == ENOMEM指示它无法分配.
为什么我编译的Python版本会影响posix_memalign的运行方式?
操作系统:Ubuntu 12.04 LTS
编译器:Clang + GCC显示相同的行为
UPDATE
我现在有了一段代码,感谢user694733
但是它的工作原理使我更加困惑:
#if PY_MAJOR_VERSION >= 3
char *buffer = NULL;
int mem_ret = posix_memalign((void**)&buffer, alignment, count);
#else
void *mem = NULL;
int mem_ret = posix_memalign(&mem, alignment, count);
char *buffer = (char*)mem;
#endif …Run Code Online (Sandbox Code Playgroud) struct Foo {};
...
void * p = (Foo*)0; // OK
void ** pp = (Foo**)0; // Invalid conversion
Run Code Online (Sandbox Code Playgroud)
据我所知,void*在 C++ 中可以隐式转换为指向任何非指针类型的指针。为什么同样不允许将 ponter 转换为指针类型 to void**?