From: Junio C Hamano Date: Thu, 26 Feb 2026 20:34:03 GMT Subject: Re: [RFC PATCH 02/14] strvec: introduce `strvec_init_alloc()` Message-ID: In-Reply-To: <50efbbb0fe8d897d7c4cd51489af4cb4c4c49d02.1771978829.git.me@ttaylorr.com> Taylor Blau writes: > When the caller knows upfront how many elements will be pushed onto a > `strvec`, it is useful to pre-allocate enough space in the array to fit > that many elements (and one additional slot to store NULL, indicating > the end of the list.) > > Introduce `strvec_init_alloc()`, which allocates the backing array large > enough to hold `alloc` elements and the termination marker without > further reallocation. > > Signed-off-by: Taylor Blau > --- > strvec.c | 7 +++++++ > strvec.h | 5 +++++ > 2 files changed, 12 insertions(+) > > diff --git a/strvec.c b/strvec.c > index f8de79f5579..f7f32a53b56 100644 > --- a/strvec.c > +++ b/strvec.c > @@ -10,6 +10,13 @@ void strvec_init(struct strvec *array) > memcpy(array, &blank, sizeof(*array)); > } > > +void strvec_init_alloc(struct strvec *array, size_t alloc) > +{ > + CALLOC_ARRAY(array->v, st_add(alloc, 1)); > + array->nr = 0; > + array->alloc = alloc + 1; > +} It is not satisifying that strvec_init() does *not* become a thin wrapper around this that says "my initial allocation is for zero elements", but that cannot be done easily as a strvec that begins as an empty one has a small optimization to avoid one-slot allocation only to store NULL. So, ... OK.