Je suis aux prises avec des vecteurs STL en C++. Je compilais mon projet pour seulement x64 pendant un certain temps (en fait pendant des mois), et tout fonctionnait bien, quand je me suis souvenu que j'avais besoin de cela pour travailler aussi sur des machines x86 (application Win32 DirectX). Bien sûr, les erreurs du compilateur sont apparues instantanément, les structures alignées de 16 bits ne seront pas alignées si elles sont par exemple passées à une fonction (ce sont les structures XMVECTOR et XMMATRIX, et XMFLOATA). J'ai résolu ces problèmes avec succès, et j'ai redémarré mon programme, jusqu'à ce que j'essaie de charger ces structures dans std :: vectors par push_back() et emplace_back(). Je donne un court exemple de code pour être clair:Impossible d'accéder aux membres alignés 16 bits de std :: vector?
struct Armature
{
string name;
int index;
//{...} There are much more
XMVECTOR translation; //Four 32 bit floating point components aligned on a 16 byte
// boundary and mapped to hardware vector registers
XMVECTOR rotation;
XMVECTOR scale;
XMMATRIX world; //it is like 4 XMVECTORs (4*4 matrix)
Armature(){
//I initialize everything here
}
};
C'est ma structure, et j'essaie de charger plusieurs Armatures dans un vecteur, comme:
std::vector<Armature> armatures;
while(ThereAreMoreArmaturesToRead()){ //roughly like this, I just parse a file and load up the information from there to fill out my Armature structure
armatures.push_back(Armature());
}
code complet ici: http://pastebin.com/6D1wF4Vh
J'ai essayé de mettre __declspec_align (16) à tout, j'ai essayé de compléter le vecteur avec Armature * et done align_malloc dans le nouvel opérateur, mais le programme quitte à chaque fois avec un emplacement de violation de violation d'accès 0xFFFFFFF parfois dans le vecteur. la fonction push_back, parfois lors de l'initialisation d'une structure XMVECTOR, etc.
Ai-je manqué quelque chose de trivial ici? Ensuite, je serais très reconnaissant si quelqu'un pouvait signaler l'évidence, ou pour toute aide.
Ceci est extrêmement peu clair. À quoi avez-vous spécifiquement appliqué align (16)? Qu'est-ce qu'un cas de test concret qui provoque une erreur d'exécution? –
Je ne vois pas de '__declspec_align (16)' dans le code présenté. Essayez-vous d'aligner tout le type d'armature, ou les champs spécifiques à l'intérieur? – WhozCraig
@Oli Charlesworth Désolé si je me suis rendu flou. J'ai essayé d'appliquer align (16) d'abord à mes structures, et après que je suis devenu vraiment désespéré, j'ai essayé de le mettre à tous les autres vérifiables aussi. Et je ne comprends pas complètement la deuxième partie de la question, désolé, mon cas de test est quand j'appelle armatures.push_back (Armature()), puis il se bloque aléatoirement dans le "vecteur" original.h » ou mon constructeur struct Induit quand je veux initialiser un XMVECTOR ou XMMATRIX. –