tech-userlevel archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: style: structures



On Tue, Oct 08, 2024 at 01:15:54PM +0000, Taylor R Campbell wrote:
> > Date: Tue, 8 Oct 2024 10:06:39 +0200
> > From: tlaronde%kergis.com@localhost
> > 
> > In the style file, for structures, the emphasis is put on alignment in
> > order to not waste memory because of undue padding.
> > 
> > Shouldn't an exception been mentionned concerning structures that may be
> > derived from a base structure, so that the first member of the derived
> > structures is a base structure, using the C standard guaranteed property
> > that the address of the first member is the address of the structure,
> > allowing to cast pointers in order to operate whether on the base
> > structure or on the derived structure?
> 
> Don't do that.  Use container_of instead.
> 
> struct derived {
> 	struct base b;
> 	int x;
> 	...
> };
> 
> int
> foo(struct base *bptr)
> {
> 	struct derived *dptr = container_of(bptr, struct derived, b);
> 
> 	return dptr->x;
> }
> 
> void
> bar(struct derived *dptr)
> {
> 	struct base *bptr = &dptr->b;
> 
> 	mumble(bptr, &foo);
> }
> 
> This way of writing things is independent of where the base structure
> goes.  Of course, if there's layers of abstraction involved, it may
> not be obvious -- and may not be stable across code evolution -- what
> the optimally aligned member ordering is, so putting the base at the
> beginning is fine.

Well, I found the definition of container_of in the following headers:

./crypto/dist/ipsec-tools/src/racoon/schedule.h
./external/mit/libuv/dist/src/uv-common.h
./external/mit/libuv/dist/test/task.h
./sys/dev/pci/cxgb/cxgb_adapter.h
./sys/external/bsd/drm2/dist/drm/i915/i915_utils.h
./sys/external/bsd/drm2/dist/drm/nouveau/include/nvif/list.h

So it is not a general thing. While placing the shared structure at
the beginning is guaranteed to yield the correct result in C (and for
the base structure, one can apply size considerations about the order
of the members).

But, whatever way, it seems to me it is worth a mention at least in
style ;-)
-- 
        Thierry Laronde <tlaronde +AT+ kergis +dot+ com>
                     http://www.kergis.com/
                    http://kertex.kergis.com/
Key fingerprint = 0FF7 E906 FBAF FE95 FD89  250D 52B1 AE95 6006 F40C


Home | Main Index | Thread Index | Old Index