Se si definisce un tipo semplice con un determinato requisito di allineamento, non è necessario che lo std::vector<t>
di tale tipo rispetti l'allineamento per ogni singolo elemento?dovrebbe std :: vector honor alignof (value_type)?
consideri il seguente esempio
typedef std::array<double,3> alignas(32) avx_point;
std::vector<avx_point> x(10);
assert(!(std::ptrdiff_t(&(x[0]))&31) && // assert that x[0] is 32-byte aligned
!(std::ptrdiff_t(&(x[1]))&31)); // assert that x[1] is 32-byte aligned
ho scoperto che il requisito di allineamento è silenzioso (senza alcun avviso) violati da clang 3.2 (con o senza -stdlib=libc++
), mentre gcc 4.8.0 emette un avviso che ignora gli attributi sull'argomento modello a std::vector
(il compilatore intel è troppo sciocco per comprendere alignas
, ma se io uso invece __declspec(align(32))
, si comporta come clang). Entrambi creano codice che fa scattare l'asserzione.
Quindi, questo comportamento corretto o un bug di clang (e icpc) e un problema con gcc?
modifica per rispondere a una questione sollevata nei commenti: se io definisco
typedef typename std::aligned_storage<sizeof (avx_point),
alignof(avx_point)>::type avx_storage;
ottengo
sizeof (avx_storage) == 32;
alignof(avx_storage) == 32;
ma std::vector<avx_storage>
non riesce ancora ad allineare il primo elemento (e quindi tutte le anche altri) per clang e gcc (senza preavviso questa volta). Quindi apparentemente ci sono due problemi con le implementazioni: in primo luogo, che std::allocator<type>
ignora qualsiasi requisito di allineamento anche per il primo elemento (illegale?) E in secondo luogo, non viene applicata alcuna spaziatura per garantire l'allineamento degli elementi successivi.
Fuori interesse, cosa succede se si confronta 'std :: vector>'? –
Useless