我正在研究使用ctypes来使用C函数来操作必须在16字节边界上对齐的SSE(__ m128)数据。
我找不到一种简单的方法来控制由ctypes分配的内存对齐,所以,现在,我正在使ctypes调用一个提供正确对齐的内存缓冲区的C函数。
我对这种方法的问题是我必须手动显式释放这个内存以防止它被泄露。
有没有办法控制ctypes分配的内存对齐?或者有没有办法注册一个清理函数来释放由ctypes调用的C函数分配的内存(除了标准的python运算符 __ del __ )?
最佳路径是什么?
答案 0 :(得分:2)
我一直在花时间去研究,我想出了一个函数,它应该允许我用ctypes分配任意对齐的内存,基本上依赖于ctypes应该在未对齐的内存缓冲区上保持引用的事实,同时具有从缓冲区中的对齐位置开始的实例。
仍需要在生产中测试它。
import ctypes
def ctypes_alloc_aligned(size, alignment):
bufSize = size+(alignment-1)
raw_memory = bytearray(bufSize)
ctypes_raw_type = (ctypes.c_char * bufSize)
ctypes_raw_memory = ctypes_raw_type.from_buffer(raw_memory)
raw_address = ctypes.addressof(ctypes_raw_memory)
offset = raw_address % alignment
offset_to_aligned = (alignment - offset) % alignment
ctypes_aligned_type = (ctypes.c_char * (bufSize-offset_to_aligned))
ctypes_aligned_memory = ctypes_aligned_type.from_buffer(raw_memory, offset_to_aligned)
return ctypes_aligned_memory
答案 1 :(得分:1)
我认为c_ulonglong
(64位)必须是64位对齐的;这是一个开始。然后doc suggests that you can use _pack_
来控制结构的对齐。这两个不是完全你想要的,但通过组合它们,你可以分配8字节对齐的结构,没有空洞。
假设一个结构包含3个8字节对齐的元素.v0
,.v1
,.v2
。使用addressof()
查看结构是否为16字节对齐。如果是,请使用.v0
和.v1
作为128位值;如果不是,请使用.v1
和.v2
。