簡體   English   中英

*(__m128*)(&A) 和 (__m128)A 有什么區別

[英]what is difference between *(__m128*)(&A) and (__m128)A

*(B*)(&A)(B)A什么區別我使用的是 simd 代碼。 但我面臨問題。
我無法將自己的vector4類型轉換為__m128

所以我確實喜歡這個
這很好用

#define XMM128Float(VECTOR4FLOAT) *(__m128*)(&VECTOR4FLOAT)

Vector4<float> vec4{};
XMM128Float(&vec4) = _mm_mul_ps(XMM128Float(*this), XMM128Float(*this));

我想知道為什么(__m128)vec4不起作用....
他們之間有什么區別。

#define XMM128Float(VECTOR4FLOAT) *(__m128*)(&VECTOR4FLOAT)

template <>
[[nodiscard]] inline SIMD_CONSTEXPR auto Vector<4, float>::sqrMagnitude() const noexcept
{
    Vector<4, float> Result;
        
    XMM128Float(Result) = _mm_mul_ps(XMM128Float(*this), XMM128Float(*this));
    return Result.x + Result.y + Result.z + Result.w;
}

我這樣寫了我的 SIMD function。

我正在使用 MS BUILD 16 編譯器

*(B*)(&A)(B)A什么區別

*(B*)(&A)使用 addressof 運算符獲取由A命名的object的地址,然后將該指針顯式轉換為另一個指針類型B* ,然后通過2間接轉換該指針。

(B)AA命名的 object 顯式轉換為B類型的新 object 。

我想知道為什么 (__m128)vec4 不起作用....

您不能將 class 類型A的值轉換為另一種類型B ,除非您為A定義了一個可以轉換為B類型或另一種可轉換為B的類型的轉換運算符(或者除非B也是 class 並且具有轉換構造函數接受A參數或可轉換為A另一種類型) - 請注意,在一個轉換序列中只能使用一個此類用戶定義的轉換; 其他轉換必須是標准轉換。


1不要在 C++ 中使用顯式轉換,即 C 樣式轉換。 請改用特定的static_castreinterpret_castconst_cast

2請注意,通過重新解釋的指針訪問 object 通常可能會導致未定義的行為,具體取決於所涉及的類型。 僅在特定情況下才允許。 請查閱編譯器的手冊以查找__m128是否屬於這種情況。

PS 避免不必要的宏。 您編寫的內容可以定義為內聯 function 。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM