Re: [PATCH 5/5] cbtree.h: define cb_init() in terms of CBTREE_INIT
- From
Jeff King <peff@peff.net>
- Date
- Sep 27, 2021, 23:54 UTC
- Message-ID
- <YVJZrOYucywgoi+v@coredump.intra.peff.net>
- In-Reply-To
- <87czou1dmp.fsf@evledraar.gmail.com>
On Mon, Sep 27, 2021 at 01:02:35PM +0200, Ævar Arnfjörð Bjarmason wrote:
Show 15 quoted lines
> >> static inline void cb_init(struct cb_tree *t)
> >> {
> >> - t->root = NULL;
> >> + struct cb_tree blank = CBTREE_INIT;
> >
> > This could be
> >
> > static const struct cb_tree blank = CBTREE_INIT;
>
> *nod*...
> [...]
> ...but to both this & the above my reply in the side-thread at
> https://lore.kernel.org/git/87h7e61duk.fsf@evledraar.gmail.com/
> applies. I.e. this is just following a pattern I got from Jeff King &
> used in bd4232fac33 (Merge branch 'ab/struct-init', 2021-07-16).I'm not sure how a compiler would react to the "static const" thing. I tested the compiler output for the "auto" struct case you've written here, and at least gcc and clang are smart enough to just initialize the pointed-to struct directly, with no extra copy.
For a "static const" I'm not sure if they'd end up with the same code, or if they'd allocate a struct in the data segment and just memcpy() into place. A non-const static would perhaps push it in the direction of the data/memcpy thing, though the compiler should be well aware that the struct is never changed nor aliased, and thus we're always writing the INIT values.
I suspect the performance is not that different either way (the big thing to avoid is initializing an auto struct on the fly and then copying from it, but this is a pretty easy optimization for compilers to get right).
Show 6 quoted lines
> >> + memcpy(t, &blank, sizeof(*t)); > > > > Is > > *t = blank; > > > > not a thing in C?
It would be fine to use struct assignment here, and should be equivalent in most compilers. They know about memcpy() and will inline it as appropriate.
I think some C programmers tend to prefer memcpy() just because that's how they think. It also wasn't legal in old K&R compilers, but as far as I know was in C89.
You have to take care with assignment of flex-structs, of course, but you also have to do so with memcpy(), too. :)
> FWIW with "const" in general I don't use it as much as I'd personally > prefer, see e.g. [1] for one recent discussion, but maybe there wouldn't > be any push-back in this case...
This isn't a parameter, so I don't think that discussion applies. _If_ you are going to make it a static, I think a const makes sense here (but probably does nothing beyond signaling your intention, because the compiler can see that it is never modified), but I wouldn't bother with either.
-Peff