[英]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)A
將A
命名的 object 顯式轉換為B
類型的新 object 。
我想知道為什么 (__m128)vec4 不起作用....
您不能將 class 類型A
的值轉換為另一種類型B
,除非您為A
定義了一個可以轉換為B
類型或另一種可轉換為B
的類型的轉換運算符(或者除非B
也是 class 並且具有轉換構造函數接受A
參數或可轉換為A
另一種類型) - 請注意,在一個轉換序列中只能使用一個此類用戶定義的轉換; 其他轉換必須是標准轉換。
1不要在 C++ 中使用顯式轉換,即 C 樣式轉換。 請改用特定的static_cast
、 reinterpret_cast
和const_cast
。
2請注意,通過重新解釋的指針訪問 object 通常可能會導致未定義的行為,具體取決於所涉及的類型。 僅在特定情況下才允許。 請查閱編譯器的手冊以查找__m128
是否屬於這種情況。
PS 避免不必要的宏。 您編寫的內容可以定義為內聯 function 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.