在在網絡上一個最教程或代碼片段見下表:SSE數據類型和原始類型
float *arr= (float*) _aligned_malloc(length * sizeof(float), 16);
__m128 *m1 = (__m128*)arr;
這是否違反嚴格別名規則或不?我會認爲它的確如此,但那麼肯定所有這些教程編寫者都不會忽略它,只是爲了方便起見,因爲__m128是一個包含float的聯合[4],也許我誤解了它的一些複雜部分。
在在網絡上一個最教程或代碼片段見下表:SSE數據類型和原始類型
float *arr= (float*) _aligned_malloc(length * sizeof(float), 16);
__m128 *m1 = (__m128*)arr;
這是否違反嚴格別名規則或不?我會認爲它的確如此,但那麼肯定所有這些教程編寫者都不會忽略它,只是爲了方便起見,因爲__m128是一個包含float的聯合[4],也許我誤解了它的一些複雜部分。
這是GCC
的xmmintrin header for GCC 4.4.3編譯器具體的答案定義如下:
typedef float __m128 __attribute__ ((__vector_size__ (16), __may_alias__));
所以,是的,你違反了嚴格的別名,但你可以這樣做。奇怪的是,__v4sf
類型沒有標記爲__may_alias__
,所以它不能以這種方式使用。
我認爲它確實違反了嚴格的別名規則,除非VC++有特殊情況。希望有人比我可以證實的更專家。另外,您是否比較了使用'_mm_store_ps'和簡單賦值生成的代碼?用這個簡單的代碼,看起來很奇怪,會有任何性能差異。 –
@Cory Nelson對不起,我在編輯之前閱讀它。我測試了幾次(也以不同的順序),並得到了上述結果。重新啓動VS後(沒有改變任何東西!)行爲完全改變了,所以我認爲還有其他事情正在發生,因爲它會很奇怪。此外,由於它似乎違反了嚴格的鋸齒規則,所以我並不在乎 - 我可以任意快速地製作錯誤的代碼;) – Voo
我不確定是否可以回答此問題。如果這是標準的C++,那麼是的,它會違反嚴格的別名規則。但是__m128 __是一個非標準擴展,所以誰來說明規則是什麼。我無法在vC++文檔中找到任何東西,所以我覺得這些規則是你應該作爲C++的擴展所規定的......但是在沒有任何官方聲明的情況下,誰能說?我會安全地使用它,並假設上面的代碼可能有風險 – jcoder