14

VS2012でコンパイルし、DirectXMathライブラリを操作しているときに、コンパイラがXMMATRIXを調整していないように見える問題が発生しました。問題を次のように簡略化しました。

#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;
}

コードを何度も再実行すると、最初の転置で「アクセス違反の読み取り場所0xFFFFFFFF」が発生する場合があり、2番目の転置で発生する場合があります。

これは、m1とm2が適切に位置合わせされていないことが原因であることがわかりました。「auto」を「XMMATRIX」に置き換えると問題が解決するようです。コンパイラのバグが疑われますが、何か間違ったことをしている、または一部のオプションを有効にしていない可能性もあります。

私のコードに何か問題がありますか、それともこれはコンパイラのバグですか?

4

3 に答える 3

3

の定義XMMATRIXは、ヘッダーファイル(xnamath.h)に次のように含まれていますが、バージョンによって異なる場合があります。

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

したがって、 (ヘッダーファイルを調べると、これに還元されます)でXMMATRIX定義されます。これは、Microsoft固有の拡張子です。__declspec(align(16))マクロではありません。これは、これがコンパイラのバグであることを意味します。コンパイラは、これらの独自の属性をautoキーワードで定義された変数に伝播できません。

autoこの場合、キーワードの使用を避けるのがおそらく最善です。明示的にdeclspec自分自身を追加するよりも、おそらくより適切です。

于 2012-09-07T16:07:15.157 に答える
2

これは間違いなくコンパイラのバグです。自分の数学の授業でも再現できます。ここでチケットを開いたので、投票してください。前述のように、autoキーワードの使用を避けることができます。または、バグが存在しないx64にコンパイルすることもできます(または、少なくとも私はそれを再現できませんでした。私のそれほど単純ではないプログラムは完全に機能します)。

于 2012-12-27T20:22:41.670 に答える
0

Visual Studio 2012の場合、ステートメントを2行に分割することで、「回避策」を実装できました。

XMMATRIX mtxMyWorldTrnspd = mtxMyWorld;
mtxMyWorldTrnspd = XMMatrixTranspose(mtxMyWorldTrnspd);
于 2014-06-11T06:11:00.790 に答える