對於SSE2指令集來說用到頻率最高的的參數或返回類型,在這篇文章裏看一下它定義的原型,並對他進行分析:
__m128i類型定義在emmintrin.h中,先來看一下它定義的原型:
typedef union __declspec(intrin_type) _CRT_ALIGN(16)
__m128i {
__int8 m128i_i8[16];
__int16 m128i_i16[8];
__int32 m128i_i32[4];
__int64 m128i_i64[2];
unsigned __int8 m128i_u8[16];
unsigned __int16 m128i_u16[8];
unsigned __int32 m128i_u32[4];
unsigned __int64 m128i_u64[2];
}
__m128i;
其中_CRT_ALIGN的定義如下:
#if !defined(_CRT_ALIGN)
#if defined(__midl)
#define _CRT_ALIGN(x)
#else
#define _CRT_ALIGN(x)
__declspec(align(x))
#endif
#endif
另外:__int8 數據類型與類型 char是同義詞的, __int16 與類型short是同義詞的,__int32 與類型 int是同義詞的,__int64 與類型long long是同義詞的。
首先:__m128i 爲一個共用體(或又稱,“聯合”,union) 類型,union的特點爲:共用體表示幾個變量共用一個內存位置,在不同的時間保存不同的數據類型和不同長度的變量。在union中,所有的共用體成員共用一個空間,並且同一時間只能儲存其中一個成員變量的值。當一個共用體被聲明時, 編譯程序自動地產生一個變量, 其長度爲聯合中最大的變量長度的整數倍。所以__m128i的大小爲128字節;
其次:__declspec(align(16))是設定內存對齊方式,來保證__m128i的大小爲128字節;