Le passage de types alignés ou de structures avec des types alignés par valeur ne fonctionne pas avec certaines implémentations. Cela casse les conteneurs STL, car certaines des méthodes (telles que resize) prennent leurs arguments en valeur.Types alignés et transmission d'arguments par valeur
Je fais des tests avec Visual Studio 2008 et je ne sais pas exactement quand et comment la valeur de transmission échoue. Ma principale préoccupation est la fonction foo. Cela semble fonctionner, mais pourrait-il être le résultat d'une inline ou d'une autre coïncidence? Que faire si je change sa signature à void foo (const __m128 &)?
Votre contribution est grandement appréciée. Je vous remercie.
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);
}
EDIT. STL échoue même avec l'allocateur aligné, parce que le problème de passer par la valeur reste.
trouvé ce lien pass __m128 by value
Quelles sont les erreurs/avertissements de compilation que vous obtenez? Je suppose quelque chose comme "paramètre formel ... ne sera pas aligné"? – celion
C'est ce que je reçois. erreur C2719: 'unnamed-parameter': paramètre formel avec __declspec (align ('16 ')) ne sera pas aligné – watson1180
En x64, les arguments de fonction prennent en charge l'alignement de 16 octets, ce problème disparaît. Je sais que cela ne résout pas votre problème immédiat, mais bon, c'est marginalement mieux que rien. ;) – jalf