如何处理CTYPES和CYTHON之间的尾垫



第三方C 库中定义的结构是:

struct CSomeStruct {
    double a;
    char b;
    int c;
}

使用CTYPES在我的Cython项目中定义的相同结构是:

class PSomeStructParent(ctypes.Structure):
    _fields_ = [
        ('a', c_double),
        ('b', c_char)
    ]
class PSomeStruct(PSomeStructParent):
    _fields_ = [
        ('c', c_int)
    ]

为什么我使用继承是因为有许多相似的结构具有相同的共同字段(100或更多)。但是C 库在各自的结构中定义了它们。C 和CTYPE具有相同的默认包装填充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尾填充填充物,并且可以在第三方库中进行验证?我不能反复定义这么多字段。

shared_fields = [
    ('a', ctypes.c_double),
    ('b', ctypes.c_char)
]
class PSomeStruct(ctypes.Structure):
  _fields_ = shared_fields + [('c',ctypes.c_int)]

给出字段是由列表定义的,您可以使用Python来构建所需的列表,最小化重复。

最新更新