std:vec for classes with constructor?
Thu Aug 6 05:16:50 GMT 2020
Andrew MacLeod via Gcc-patches <email@example.com> writes:
> On 8/5/20 12:54 PM, Richard Biener via Gcc-patches wrote:
>> On August 5, 2020 5:09:19 PM GMT+02:00, Martin Jambor <firstname.lastname@example.org> wrote:
>>> On Fri, Jul 31 2020, Aldy Hernandez via Gcc-patches wrote:
>>>> * ipa-cp changes from vec<value_range> to std::vec<value_range>.
>>>> We are using std::vec to ensure constructors are run, which they
>>>> in our internal vec<> implementation. Although we usually steer away
>>>> from using std::vec because of interactions with our GC system,
>>>> ipcp_param_lattices is only live within the pass and allocated with
>>> Ummm... I did not object but I will save the URL of this message in the
>>> archive so that I can waive it in front of anyone complaining why I
>>> don't use our internal vec's in IPA data structures.
>>> But it actually raises a broader question: was this supposed to be an
>>> exception, allowed only not to complicate the irange patch further, or
>>> will this be generally accepted thing to do when someone wants to have
>>> vector of constructed items?
>> It's definitely not what we want. You have to find another solution to this problem.
> Why isn't it what we want?
> This is a small vector local to the pass so it doesn't interfere with
> our PITA GTY.
> The class is pretty straightforward, but we do need a constructor to
> initialize the pointer and the max-size field. There is no allocation
> done per element, so a small number of elements have a couple of fields
> initialized per element. We'd have to loop to do that anyway.
> GCC's vec<> does not provide he ability to run a constructor, std::vec
I realise you weren't claiming otherwise, but: that could be fixed :-)
> I quizzed some libstdc++ folks, and there has been a lot of
> optimizations done on std::vec over the last few years,.. They think its
> pretty good now, and we were encouraged to use it.
> We can visit the question tho... What is the rationale for not using
> std::vec in the compiler? We currently use std::swap, std:pair,
> std::map, std::sort, and a few others.
> is there some aspect of using std::vec I am not aware of that makes it
> something we need to avoid?
One reason to prefer vec<> for general interfaces is that it
works with auto_vec<…, N>, making it possible to pre-allocate a
reasonably-sized buffer on the stack without needing a round-trip
through the allocators.
FWIW, that isn't simply a GCC thing. LLVM (which is obviously much
more C++-intensive than GCC) still makes heavy use of SmallVector for
automatic variables. And the reason we have things like memory_block.h
is that malloc did used to show up high in profiles.
(FWIW, I'm not saying that's an argument in favour of avoiding
std::vector completely. It's just a reason why it might not always
be the right choice.)
More information about the Gcc-patches