std:vec for classes with constructor?
Jakub Jelinek
jakub@redhat.com
Fri Aug 7 08:55:08 GMT 2020
On Fri, Aug 07, 2020 at 09:34:38AM +0100, Jonathan Wakely via Gcc-patches wrote:
> > Now that you say it, vec has a T[1] member so depending on T
> > there might be a side-effect as invoking its CTOR? Or it might
> > even not compile if there is no default CTOR available... Ick :/
>
> Right.
>
> Does the GTY stuff add members to the struct, or otherwise alter its
> layout?
Or perhaps use offsetof on an alternate structure that should have the same
layout.
So instead of
typedef vec<T, A, vl_embed> vec_embedded;
return offsetof (vec_embedded, m_vecdata) + alloc * sizeof (T);
use
struct alignas (T) U { char data[sizeof (T)]; };
typedef vec<U, A, vl_embed> vec_embedded;
return offsetof (vec_embedded, m_vecdata) + alloc * sizeof (T);
where vec_embedded should have the same offset of m_vecdata as vec.
Proof of concept:
template <typename T>
struct vec
{
int a;
T m_vecdata[1];
};
template <typename T>
int
foo (int alloc)
{
// typedef vec<T> vec_embedded;
struct alignas (T) U { char data[sizeof (T)]; };
typedef vec<U> vec_embedded;
return __builtin_offsetof (vec_embedded, m_vecdata) + alloc * sizeof (T);
}
struct V { };
struct S : virtual V { long long l; S (); ~S (); };
int a = foo <S> (0);
Jakub
More information about the Gcc-patches
mailing list