Il passaggio di tipi o strutture allineati con tipi allineati per valore non funziona con alcune implementazioni. Questo rompe i contenitori STL, perché alcuni dei metodi (come ridimensionare) prendono i loro argomenti in base al valore.Tipi allineati e argomenti di passaggio in base al valore
Eseguo alcuni test con Visual Studio 2008 e non del tutto sicuro di quando e in che modo il passaggio per valore non riesce. La mia preoccupazione principale è la funzione pippo. Sembra funzionare bene, ma potrebbe essere il risultato di un inlining o di qualche altra coincidenza? Cosa succede se cambio la sua firma in void foo (const __m128 &)?
Il tuo contributo è molto apprezzato. Grazie.
struct A
{
__m128 x;
int n;
};
void foo(__m128);
void bar(A);
void f1()
{
// won't compile
// std::vector<A> vec1(3);
// compiles, but fails at runtime when elements are accessed
std::vector<__m128> vec2(3);
// this seems to work. WHY???
std::vector<__m128, some_16_byte_aligned_allocator<__m128> > vec3(3);
__m128 x;
A a;
// passed by value, is it OK?
foo(x);
// won't compile
//bar(a);
}
MODIFICA. STL non riesce nemmeno con l'allocatore allineato, poiché il problema del valore passato rimane.
trovato questo link pass __m128 by value
Quali sono gli errori/gli avvisi di compilazione che stai ottenendo? Presumo che qualcosa come "parametro formale ... non sia allineato"? – celion
Questo è quello che ottengo. errore C2719: 'parametro senza nome': il parametro formale con __declspec (align ('16 ')) non sarà allineato – watson1180
In x64, gli argomenti delle funzioni supportano l'allineamento di 16 byte, quindi questo problema scompare. So che non risolve il tuo problema immediato, ma hey, è marginalmente meglio di niente. ;) – jalf