如何处理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 构建所需的列表,从而最大限度地减少重复。