14

Al compilar con VS2012 y trabajar con la biblioteca DirectXMath, encontré un problema donde parecía que el compilador no estaba alineando mi XMMATRIX. Simplifiqué el problema a lo siguiente.Alineación 16 no respetada cuando se utiliza la palabra clave 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; 
} 

Volver a ejecutar el código una y otra va a causar a veces un "acceso de lectura violación 0xFFFFFFFF ubicación" en la primera transposición, a veces en el segundo.

He descubierto que esto se debe a que m1 y m2 no se alinean correctamente. Reemplazar "auto" con "XMMATRIX" parece resolver el problema, por lo que sospecho que es un error del compilador, pero también es posible que esté haciendo algo mal o que no esté habilitando alguna opción.

¿Hay algún problema con mi código o es un error del compilador?

+0

¿Ha tenido un vistazo al conjunto resultante para comprobar si hay alguna diferencia? –

+0

@ J.N. sí, si no uso "auto" entonces definitivamente tiene instrucciones adicionales que juegan con esp y (supongo) ayudan a asegurar que los dos XMMATRIX estén alineados correctamente. – MerickOWA

+0

Bueno, a menos que 'XMMATRIX' sea una macro, yo voto por un error del compilador. Si es una macro, entonces puede ser un error DX ... –

Respuesta

3

La definición de XMMATRIX tiene lo siguiente en el archivo de encabezado (xnamath.h), aunque esto podría ser diferente en su versión.

// 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 

Así XMMATRIX se define con __declspec(align(16)) (si se mira a través de los archivos de cabecera se reduce a esto), que es una extensión específica Microsoft. No es una macro. Esto significa que es un error del compilador, el compilador no puede propagar estos atributos propietarios a las variables definidas con la palabra clave auto.

Probablemente sea mejor evitar el uso de la palabra clave auto en este caso, es probable que sea mejor que agregar explícitamente el declspec usted mismo.

2

Esto es definitivamente un error del compilador. Puedo reproducirlo también con mis propias clases de matemáticas. He abierto un boleto here así que vota por él. Puede evitar el uso de la palabra clave auto, como se mencionó. O puede compilar a x64 donde el error no está presente (o al menos no pude reproducirlo; mi programa no tan simple funciona perfectamente).

+0

Ya se ha agregado para conectarse a Microsoft. Microsoft dice que será reparado en la próxima versión de C++ https://connect.microsoft.com/VisualStudio/feedback/details/761026/xmmatrix-not-properly-aligned-when-using-c-11-auto-keyword – MerickOWA

+0

Glad escuchar. Esperando el próximo ctp ... –

+0

Parece que aún no se ha solucionado en VS2012. – Trax

0

Para Visual Studio 2012, que fue capaz de poner en práctica una "solución temporal" que mediante el fraccionamiento de la declaración en dos líneas:

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

Ya, lo mencioné en mi pregunta. – MerickOWA

Cuestiones relacionadas