14

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?

+0

Hai avuto uno sguardo al assembly risultante per verificare eventuali differenze? –

+0

@ 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

+0

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 ... –

risposta

3

La definizione per XMMATRIX ha il seguente nel file di intestazione (xnamath.h), anche se questo potrebbe essere diverso nella versione.

// Matrix type: Sixteen 32 bit floating point components aligned on a 
// 16 byte boundary and mapped to four hardware vector registers 
#if (defined(_XM_X86_) || defined(_XM_X64_)) && defined(_XM_NO_INTRINSICS_) 
typedef struct _XMMATRIX 
#else 
typedef _DECLSPEC_ALIGN_16_ struct _XMMATRIX 
#endif 

Così XMMATRIX viene definito con __declspec(align(16)) (se si guarda attraverso i file di intestazione che non si riducono a questo), che è un'estensione specifica di Microsoft. Non è una macro. Ciò significa che si tratta di un bug del compilatore, il compilatore non riesce a propagare questi attributi proprietari alle variabili definite con la parola chiave auto.

Probabilmente è meglio evitare semplicemente l'uso della parola chiave auto in questo caso, è probabilmente più ordinata rispetto all'aggiunta esplicita del declspec.

2

Questo è sicuramente un bug del compilatore. Posso anche riprodurlo con le mie lezioni di matematica. Ho aperto un biglietto here quindi vota per questo. È possibile evitare l'uso della parola chiave auto, come menzionato. Oppure puoi compilare a x64 dove il bug non è presente (o almeno non ero in grado di riprodurlo, il mio programma non-così-semplice funziona perfettamente).

+0

E 'stato già aggiunto per connetterti con Microsoft. Microsoft afferma che verrà risolto nella prossima versione di C++ https://connect.microsoft.com/VisualStudio/feedback/details/761026/xmmatrix-not-properly-aligned-when-using-c-11-auto-keyword – MerickOWA

+0

Glad ascoltare. Aspettando il prossimo ctp ... –

+0

Sembra che non sia ancora fissato su VS2012. – Trax

0

Per Visual Studio 2012, sono stato in grado di attuare un "work-around" che suddividendo l'affermazione in due linee:

XMMATRIX mtxMyWorldTrnspd = mtxMyWorld; 
mtxMyWorldTrnspd = XMMatrixTranspose(mtxMyWorldTrnspd); 
+0

Ya, l'ho menzionato nella mia domanda. – MerickOWA

Problemi correlati