> Date: Tue, 8 Oct 2024 10:06:39 +0200
> From: tlaro...@kergis.com
> 
> 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.

Reply via email to