On Mon, Jan 20, 2025 at 6:26 PM Jason Merrill <ja...@redhat.com> wrote: > > On 1/20/25 5:09 AM, Richard Biener wrote: > > On Sat, Jan 18, 2025 at 1:02 AM Jason Merrill <ja...@redhat.com> wrote: > > >> I notice that the second argument to vec_safe_reserve is the number of > >> empty spaces to provide, rather than the new desired capacity. So this > >> will allocate space for an additional copy of the whole constructor. > >> > >> I guess you want to say reserve (ret, nelts - vec_safe_length (res))? > >> It's weird that there isn't a more convenient way to express that. > >> > >> Note that this behavior differs from the C++ standard library, where > >> reserve indeed specifies the new capacity. This seems likely to cause a > >> lot of confusion (and over-allocation) going forward. And indeed > >> looking through exising uses turns up at least two that seem to assume > >> the standard library semantics (as well as others that assume the actual > >> semantics). > >> > >> I wonder about renaming the existing reserve to reserve_space and adding > >> a reserve_capacity? > > > > To me that's equally confusing. To me our ::reserve semantics is sound, > > but I can see if you know std::vector by heard that you're easily confused. > > > > IMO std::vector::reserve (1) doing nothing when .length () == 2 is > > confusing, > > I asked it to reserve some space! So, can we fix the standard library > > instead? > > (OK, just joking) > > > > We do have the issue of branch maintainance when doing any change here, > > so we can't change the semantic of ::reserve but we'd have to remove it. > > Agreed. > > > I'll note we have ::space to query free capacity while the standard library > > only has ::capacity. So iff then we should simply rename > > ::reserve to ::reserve_space, but not adding another (confusing) variant. > > You don't think there should be a way to specify a new minimum capacity > without subtracting the current length?
It doesn't feel natural - if you'd then fill up to that you'd know how many elements you'd add. If you replace the contents completely then use .truncate (0); reserve (new-size)? > > Jason >