私は DirectXMath (または XNAMath) ライブラリ (Windows SDK の DirectXMath.h ヘッダーで定義されている) を使用しています。これは、非常にパフォーマンスが高く、物理とレンダリングに必要なすべてのものを提供しているようです。ただし、非常に冗長であることがわかりました (XMStoreFloatX と XMLloadFloatX をどこでも使用するのは面倒です)。
操作を少し簡単にしようとしていて、代入演算子/変換演算子でストア/ロードを非表示にするというアイデアを思いつきました。これらは両方ともメンバー関数である必要があるため、例として次のコードを思いつきました。
struct Vector2F : public DirectX::XMFLOAT2 {
inline Vector2F() : DirectX::XMFLOAT2() {};
inline Vector2F(float x, float y) : DirectX::XMFLOAT2(x, y) {};
inline Vector2F(float const * pArray) : DirectX::XMFLOAT2(pArray) {};
inline Vector2F(DirectX::XMVECTOR vector) {
DirectX::XMStoreFloat2(this, vector);
}
inline Vector2F& __vectorcall operator= (DirectX::XMVECTOR vector) {
DirectX::XMStoreFloat2(this, vector);
return *this;
}
inline __vectorcall operator DirectX::XMVECTOR() {
return DirectX::XMLoadFloat2(this);
}
};
ご覧のとおり、XMFLOAT2 のパブリック インターフェイスをレプリケートし、コンストラクター、代入演算子、および DirectXMath が計算に使用する SIMD 型である XMVECTOR の変換を追加します。DirectXMath が提供するすべてのストレージ構造体に対してこれを行うつもりです。
パフォーマンスは数学ライブラリにとって非常に重要な要素であるため、私の質問は次のとおりです。そのような継承のパフォーマンスへの影響は何ですか? ライブラリの通常の使用と比較して、生成される追加のコードはありますか (もちろん、完全な最適化を前提としています)。
基本的に構造体と関数の名前を変更しているだけなので、直感的に、生成されたコードは、これらの便利な演算子を使用せずに冗長バリアントを使用している場合とまったく同じになるはずです。でも、もしかしたら私が知らない面もあるのでは?
PS 追加のコードが追加されるため、代入演算子の戻り値の型について少し心配です。参照を省略して最適化するのは良い考えでしょうか?