Thread: [ctypes-users] Structure inheritance and tail padding
Brought to you by:
theller
From: Carlos P. <car...@gm...> - 2016-02-06 14:26:05
|
Hi all, just from observation I arrived to the unconfirmed conclusion that Structure inheritance adds tail padding. For example: class A(Structure): _fields_ = [('a', c_double), ('b', c_char)] class B(A): _fields_ = [('c', c_int)] will not show the same layout than: class C(Structure): _fields_ = [('a', c_double), ('b', c_char), ('c', c_int)] Supposing my conclusion is right, what is the intention of this feature: i. To support c++ pod subclassing? (most compilers reuse the tail padding for non-pod subclassing). ii. To support a more oo view of c struct composition? (btw, it complements the ms-extensions very well). Thank you in advance -- Carlos |
From: eryk s. <er...@gm...> - 2016-02-07 02:04:58
|
On Sat, Feb 6, 2016 at 8:25 AM, Carlos Pita <car...@gm...> wrote: > > just from observation I arrived to the unconfirmed conclusion that > Structure inheritance adds tail padding. For example: > > class A(Structure): > _fields_ = [('a', c_double), ('b', c_char)] > > class B(A): > _fields_ = [('c', c_int)] > It's a subclass alternative to the following: class A(Structure): _fields_ = (('a', c_double), ('b', c_char)) class B(Structure): _anonymous_ = '_A', _fields_ = (('_A', A), ('c', c_int)) FYI, the padding at the end of "A" provides aligned access in aggregates (arrays, structs). The size of "A" is 16 bytes, which is a multiple of its 8-byte alignment. Similarly the size of B has to be rounded up to 24 bytes, with 4 trailing pad bytes. >>> sizeof(B), alignment(B) (24, 8) >>> B.c <Field type=c_int, ofs=16, size=4> Using a subclass is a good idea when several structures share a common header. It's more flexible and scalable than cramming everything into a union. |