私は、すべての乗算と演算がXMVECTOR (SIMD ラッパー) で行われる DirectXMath.h を使用しています。ストレージには、3 つの float を含む XMFLOAT3 が使用されます。XMFLOAT3*XMFLOAT3 と XMFLOAT3*float の両方) できますか?それとも、SDK の DirectXMath ヘッダーを改ざんする必要がありますか?
質問する
1356 次
4 に答える
4
はい、オーバーロードを定義できますが、メンバー関数としてではなく、フリー関数としてのみ定義できます。
したがって、次のようなことを行うことができます(これがあなたが興味を持っている過負荷であると仮定して):
XMFLOAT3 operator*(XMFLOAT3 a, XMFLOAT3 b) {
// whatever
}
于 2013-01-09T01:13:20.680 に答える
3
もちろん、C ++では、次のように、演算子のオーバーロードをフリー関数として提供できます。
XMFLOAT3 operator*(XMFLOAT3 left, XMFLOAT3 right)
{
...
}
これがパフォーマンスに敏感なコードで使用される場合は、値渡しと定数渡しの参照によって、出力されるコード/パフォーマンスに違いが生じるかどうかを確認してください。
于 2013-01-09T01:14:54.423 に答える
3
XMFLOAT3 operator*(const XMFLOAT3& a, const XMFLOAT3& b){
XMFLOAT3 ans;
...
return ans;
}
これは回答のコピーを返し、2 つのオペランドのいずれも変更しないことに注意してください。これは、*
演算子のセマンティクスに当てはまります。
于 2013-01-09T01:15:34.733 に答える
2
次のように定義してoperator*
ください:
XMFLOAT3 operator*(XMFLOAT3 l, XMFLOAT3 r) {
XMVECTOR lvec(XMLoadFloat3(&l));
XMVECTOR rvec(XMLoadFloat3(&r));
//Perform operations
}
XMFLOAT3 operator*(XMFLOAT3 l, float r) {
XMVECTOR lvec(XMLoadFloat3(&l));
//Perform operations
}
XMFLOAT3 operator*(float l, XMFLOAT3 r) {
XMVECTOR rvec(XMLoadFloat3(&r));
//Perform operations
}
于 2013-01-09T01:15:24.113 に答える