如何处理ctypes和cython之间的拖尾填充?

时间:2017-03-16 01:44:05

标签: structure padding cython ctypes tail

第三方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 ++和ctypes具有相同的默认包填充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尾部填充并可以转移到第三方库?我无法重复定义这么多领域。

1 个答案:

答案 0 :(得分:1)

shared_fields = [
    ('a', ctypes.c_double),
    ('b', ctypes.c_char)
]

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

假设字段是由列表定义的,您可以使用Python来构建所需的列表,从而最大限度地减少重复。