Date: Sat, 28 Dec 2024 10:18:36 +0100
On 2024-12-28 at 01:05, Andre Kostur via Std-Proposals wrote:
> Resize erases the number of “excess” elements, but where does it say
> that it affects the capacity?
> [vector.capacity]. Erase doesn’t seem to talk about reducing the
> capacity either [vector.modifiers].
The spec is under reserve(), which claims that no reallocations will
happen until the size surpasses the new capacity. This would not work if
other members could reduce the capacity.
>
> On Fri, Dec 27, 2024 at 2:51 PM Chris Ryan <chrisr98008_at_[hidden]
> <mailto:chrisr98008_at_[hidden]>> wrote:
>
> Hi Andre,
> .resize(0) actually deletes the storage. Farrakh is wanting it to
> preserve the storage (keep the .capacity(), not have to alloc it again)
>
> Farrakh,
> I think that you might not realize the reason .clear() is slower is
> because it has to call the in-place destructor for each element
> (zero through size(), but not all the way up to .capacity()) You
> can't just change the count or you screw up the object lifetime of
> those objects that were not destructed. D'tors won't get called.
> Index positions may potentially get overwritten later with
> subsequent push_backs(...) and the in-place c'tors calls. (thus
> causing leaks)
>
> https://en.cppreference.com/w/cpp/container/vector/clear <https://
> en.cppreference.com/w/cpp/container/vector/clear>
>
>
> On Fri, Dec 27, 2024 at 2:08 PM Andre Kostur via Std-Proposals <std-
> proposals_at_[hidden] <mailto:std-proposals_at_[hidden]>>
> wrote:
>
> What’s wrong with .resize(0) ?
>
> On Fri, Dec 27, 2024 at 1:57 PM Фаррах Фаттахов via Std-
> Proposals <std-proposals_at_[hidden] <mailto:std-
> proposals_at_[hidden]>> wrote:
>
> After working with SFML, I so hated std::vector (I was a bad
> programmer back then and didn't know about the reserve()
> function, which led to not understanding why std::vector is
> so slow, while a simple array performs much better). As a
> result, in my new project i created my own version of
> std::vector - FE2D::dynamic_array. And there, from the
> beginning i created one useful function - reset()
> ```C++
>
> // Reset the Size of Dynamic Array to Zero, but it's don't
> Touches the Real Occupied Memory of Dynamic Array void
> reset() { mSize = 0; }
> ```
>
> Instead of clear() it's just setting mSize to zero. It's
> very useful in the situations like
>
> ```C++
> void Render() { // It's called every frame // Add a sprites
> to the FE2D::dynamic_array to draw it later
> m_Renderer.AddSprite(m_Sprite_0);
> m_Renderer.AddSprite(m_Sprite_1);
> m_Renderer.AddSprite(m_Sprite_2); ... // Draw the Sprites
> and reset the dynamic arrays to prepare it for the next
> frame m_Renderer.RenderSprites(); }
> ```
> Here reset() works like clear(), but much faster
>
> In the std::vector or std::deque is no functions like
> reset() and i want to add it there, especially sometimes i
> get errors because my FE2D::dynamic_array is not so good
> like std::vector and i have to use it instead of mine, but
> there is no function i need. I think reset() will be nice
> thing for std::vector.
> Resize erases the number of “excess” elements, but where does it say
> that it affects the capacity?
> [vector.capacity]. Erase doesn’t seem to talk about reducing the
> capacity either [vector.modifiers].
The spec is under reserve(), which claims that no reallocations will
happen until the size surpasses the new capacity. This would not work if
other members could reduce the capacity.
>
> On Fri, Dec 27, 2024 at 2:51 PM Chris Ryan <chrisr98008_at_[hidden]
> <mailto:chrisr98008_at_[hidden]>> wrote:
>
> Hi Andre,
> .resize(0) actually deletes the storage. Farrakh is wanting it to
> preserve the storage (keep the .capacity(), not have to alloc it again)
>
> Farrakh,
> I think that you might not realize the reason .clear() is slower is
> because it has to call the in-place destructor for each element
> (zero through size(), but not all the way up to .capacity()) You
> can't just change the count or you screw up the object lifetime of
> those objects that were not destructed. D'tors won't get called.
> Index positions may potentially get overwritten later with
> subsequent push_backs(...) and the in-place c'tors calls. (thus
> causing leaks)
>
> https://en.cppreference.com/w/cpp/container/vector/clear <https://
> en.cppreference.com/w/cpp/container/vector/clear>
>
>
> On Fri, Dec 27, 2024 at 2:08 PM Andre Kostur via Std-Proposals <std-
> proposals_at_[hidden] <mailto:std-proposals_at_[hidden]>>
> wrote:
>
> What’s wrong with .resize(0) ?
>
> On Fri, Dec 27, 2024 at 1:57 PM Фаррах Фаттахов via Std-
> Proposals <std-proposals_at_[hidden] <mailto:std-
> proposals_at_[hidden]>> wrote:
>
> After working with SFML, I so hated std::vector (I was a bad
> programmer back then and didn't know about the reserve()
> function, which led to not understanding why std::vector is
> so slow, while a simple array performs much better). As a
> result, in my new project i created my own version of
> std::vector - FE2D::dynamic_array. And there, from the
> beginning i created one useful function - reset()
> ```C++
>
> // Reset the Size of Dynamic Array to Zero, but it's don't
> Touches the Real Occupied Memory of Dynamic Array void
> reset() { mSize = 0; }
> ```
>
> Instead of clear() it's just setting mSize to zero. It's
> very useful in the situations like
>
> ```C++
> void Render() { // It's called every frame // Add a sprites
> to the FE2D::dynamic_array to draw it later
> m_Renderer.AddSprite(m_Sprite_0);
> m_Renderer.AddSprite(m_Sprite_1);
> m_Renderer.AddSprite(m_Sprite_2); ... // Draw the Sprites
> and reset the dynamic arrays to prepare it for the next
> frame m_Renderer.RenderSprites(); }
> ```
> Here reset() works like clear(), but much faster
>
> In the std::vector or std::deque is no functions like
> reset() and i want to add it there, especially sometimes i
> get errors because my FE2D::dynamic_array is not so good
> like std::vector and i have to use it instead of mine, but
> there is no function i need. I think reset() will be nice
> thing for std::vector.
Received on 2024-12-28 09:18:45