On 12/5/19 2:53 PM, Richard Biener wrote:
On December 5, 2019 2:03:58 PM GMT+01:00, "Martin Liška" <mli...@suse.cz> wrote:
On 12/5/19 1:59 PM, Richard Biener wrote:
Isn't there ggc_alloc <T> for this? Also ggc_alloc_no_dtor<T> in
case you
want to handle finalization yourself.
No, if I see correctly it only calls Dtor:
But its odd to handle finalization but not construction here and not
finalization in your new wrapper.
No, ggc_new calls ggc_alloc that will eventually call destructor for types
with non-trivial destructors.
Alternative solution would be to no come up with ggc_alloc and call default
ctor in ggc_alloc. But that's too restrictive as all types must have default
constructor. That's not desirable to me.
Martin
That doesn't look like a good API. I see Honza approved the change but maybe
you can fix the actual issue without this new API for the moment.
Richard.
template<typename T>
inline T *
ggc_alloc (ALONE_CXX_MEM_STAT_INFO)
{
if (need_finalization_p<T> ())
return static_cast<T *> (ggc_internal_alloc (sizeof (T), finalize<T>,
0, 1
PASS_MEM_STAT));
else
return static_cast<T *> (ggc_internal_alloc (sizeof (T), NULL, 0, 1
PASS_MEM_STAT));
}
...
/* Allocate a chunk of memory of SIZE bytes. Its contents are
undefined. */
void *
ggc_internal_alloc (size_t size, void (*f)(void *), size_t s, size_t n
MEM_STAT_DECL)
{
...
The function is generic, it does not know about type T. That's why it
does not (and can't call) ctor.
Martin