先日のDirectXのスケルトンのような形から少しずつ手を加え、ひとまず複数のオブジェクトを描画できる状態にもってきました。
ここでオブジェクトごとに行列を持たせるようにクラスのメンバにXMMATRIX型のものを作っていたところ、コンパイル時に「ヒープで割り当てられたオブジェクトが 16 にアラインメントされていない可能性があります」という警告が出るようになりました。
さらに無視して続けていると
「C2338 You've instantiated std::aligned_storage
どうもXMMATRIX型のアライメントが16バイトである関係上、make_sharedしたりすると正しい位置にメモリを確保できなくなってしまうようです。
しっかり対応するならnewの動作を上書きして云々、となるみたいですがそこまでするのは流石に大掛かりな感じがあります。
というわけでクラスのメンバとして持つ変数をXMMATRIXではなく、XMFLOAT4X4型に置き換えることで解決しました。
行列の計算に使うXMMatrixMultiply等の関数ではXMMATRIX型が必要になるため、その都度XMFLOAT4X4からXMMATRIXに変換して使うスタイルです。やや手間が増えますが致し方なし。
XMFLOAT4X4からXMMATRIXへの変換はXMLoadFloat4x4、逆はXMStoreFloat4x4関数で行えるみたいですね。
アライメントが16バイトに設定されているのは高速に処理を行うためのようで。似たような型が複数あって分かりにくいのもなるべくしてなったと云うべきか。