如何处理ctypes和cython之间的tailing padding?
How to deal with the tailing padding between ctypes and cython?
第三方c++库中定义的结构为:
struct CSomeStruct {
double a;
char b;
int c;
}
在我的 cython 项目中使用 ctypes 定义的相同结构是:
class PSomeStructParent(ctypes.Structure):
_fields_ = [
('a', c_double),
('b', c_char)
]
class PSomeStruct(PSomeStructParent):
_fields_ = [
('c', c_int)
]
为什么我使用继承是因为有许多相似的结构具有相同的公共字段(100 或更多)。但是 c++ 库在各自的结构中定义了它们。 C++ 和 ctypes 具有相同的默认 pack padding 8。因此,如果我在 c++ 和 cython 之间传输这些结构,内存缓冲区不同,无法正确转换。
sizeof(CStruct) = sizeof(double)+sizeof(char)+3+sizeof(int) = 8+1+3+4 = 16
sizeof(PStruct) = sizeof(c_double)+sizeof(c_char)+7+sizeof(int)+4 = 8+1+7+4+4=24
有没有什么方法可以处理ctypes的tailing padding并且可以移植给第三方库?受不了重复定义那么多字段
shared_fields = [
('a', ctypes.c_double),
('b', ctypes.c_char)
]
class PSomeStruct(ctypes.Structure):
_fields_ = shared_fields + [('c',ctypes.c_int)]
假定字段由列表定义,您可以使用 Python 构建所需的列表,从而最大限度地减少重复。
第三方c++库中定义的结构为:
struct CSomeStruct {
double a;
char b;
int c;
}
在我的 cython 项目中使用 ctypes 定义的相同结构是:
class PSomeStructParent(ctypes.Structure):
_fields_ = [
('a', c_double),
('b', c_char)
]
class PSomeStruct(PSomeStructParent):
_fields_ = [
('c', c_int)
]
为什么我使用继承是因为有许多相似的结构具有相同的公共字段(100 或更多)。但是 c++ 库在各自的结构中定义了它们。 C++ 和 ctypes 具有相同的默认 pack padding 8。因此,如果我在 c++ 和 cython 之间传输这些结构,内存缓冲区不同,无法正确转换。
sizeof(CStruct) = sizeof(double)+sizeof(char)+3+sizeof(int) = 8+1+3+4 = 16
sizeof(PStruct) = sizeof(c_double)+sizeof(c_char)+7+sizeof(int)+4 = 8+1+7+4+4=24
有没有什么方法可以处理ctypes的tailing padding并且可以移植给第三方库?受不了重复定义那么多字段
shared_fields = [
('a', ctypes.c_double),
('b', ctypes.c_char)
]
class PSomeStruct(ctypes.Structure):
_fields_ = shared_fields + [('c',ctypes.c_int)]
假定字段由列表定义,您可以使用 Python 构建所需的列表,从而最大限度地减少重复。