Re: [RFC PATCH 02/14] strvec: introduce `strvec_init_alloc()`
- From
Junio C Hamano <gitster@pobox.com>
- Date
- Feb 26, 2026, 20:34 UTC
- Message-ID
- <xmqqh5r31byc.fsf@gitster.g>
- In-Reply-To
- <50efbbb0fe8d897d7c4cd51489af4cb4c4c49d02.1771978829.git.me@ttaylorr.com>
Taylor Blau <me@ttaylorr.com> writes:
Show 29 quoted lines
> 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 <me@ttaylorr.com>
> ---
> 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.