2016-11-27 57 views

回答

2

它完全取決於您的目標架構。

如果您使用的x86,那麼你the documentation聯說,沒有原子爲128位類型比較並交換:

的「__atomic」內建可與任何積分標量使用或長度爲1,2,4或8字節的指針類型。如果體系結構支持'__int128'(請參閱__int128),則也允許使用16字節的整數類型。

__int128鏈接的文檔,它說:

作爲擴展整數標量型__int128是支持具有整數模式寬度足以容納128位的目標。只需將__int128寫爲有符號的128位整數,或將無符號__int128寫爲無符號的128位整數。 GCC不支持對長整數長度小於128位的目標表達__int128類型的整數常量。

x86沒有足夠寬的整數模式來保存128位。即使在64位x86上,long long類型也對應64位整數,小於128位寬。因此,文檔建議在x86上不支持128位類型的內部函數。

也就是說,x86架構does有一個cmpxchg16b指令,它允許在16字節類型上進行原子比較和交換。我不知道GCC __atomic內置插件是否支持發出這條指令。 (不幸的是,there are some x86 processors that do not support this instruction;您需要確定目標處理器是否支持它,或者編寫執行運行時檢查的代碼,並且如果當前系統不支持,則可以回退到其他實現。 64位AMD處理器不支持cmpxchg16b,以及英特爾酷睿/酷睿2處理器也缺乏支持的某些步進,它也是not supported by Intel's Many Integrated Core (MIC) architecture

無論如何,cmpxchg16b確實其實要求它的目的操作數是16字節對齊,所以導致它被髮射的任何內在因素都會對用戶產生相同的要求。用__attribute__((__aligned__(16)))註釋將實現此目標。

如果您使用x86以外的體系結構,並且它本機支持標量128位整數類型,那麼您必須查閱其文檔以查看其比較和交換指令是否需要對齊。它可能的確如此,即使在沒有必要的情況下,它也幾乎不會損害性能。