Compilando con VS2012 e lavorando con la libreria DirectXMath, ho riscontrato un problema in cui sembrava che il compilatore non stesse allineando il mio XMMATRIX. Ho semplificato il problema fino al seguente.Allineamento 16 non rispettato quando si utilizza la parola chiave auto?
#include <DirectXMath.h>
using namespace DirectX;
int _tmain(int argc, _TCHAR* argv[])
{
auto m1 = XMMatrixIdentity();
auto m2 = XMMatrixIdentity();
auto t1 = XMMatrixTranspose(m1); // sometimes access violation occurs here
auto t2 = XMMatrixTranspose(m2); // or sometimes here
return 0;
}
Ri-eseguire il codice più e più volte a volte causare una "Violazione di accesso lettura posizione 0xFFFFFFFF" sulla prima trasposizione, a volte al secondo.
Ho capito che questo è dovuto al fatto che m1 e m2 non sono allineati correttamente. Sostituire "auto" con "XMMATRIX" sembra risolvere il problema, quindi il mio sospetto è un bug del compilatore, ma è anche possibile che sto facendo qualcosa di sbagliato, o non abilitando alcune opzioni.
C'è qualcosa di sbagliato nel mio codice o si tratta di un bug del compilatore?
Hai avuto uno sguardo al assembly risultante per verificare eventuali differenze? –
@ J.N. sì, se non uso "auto" allora ha sicuramente delle istruzioni extra che armeggiano con esp e (presumo) aiuta a garantire che i due XMMATRIX siano allineati correttamente. – MerickOWA
Beh, a meno che 'XMMATRIX' sia una macro, voto per un bug del compilatore. Se si tratta di una macro, potrebbe essere un errore DX ... –