2014-11-03 59 views
2

我試圖找到類型Tstd::atomic的比較語義的定義。比較語義與std ::原子類型

我知道,除了內置專門的積分類型,T可以是任何TriviallyCopyable類型。但是如何操作像compare_and_exchange_X知道如何比較T的一個實例?

我想他們必須簡單地做一個字節一個字節的比較用戶定義的對象(如memcmp),但我沒有看到這是明確提到的標準在哪裏。

因此,假設我有:

struct foo 
{ 
    std::uint64_t x; 
    std::uint64_t y; 
}; 

編譯器如何知道如何將兩個std::atomic<foo>實例比較,當我打電話std::atomic<foo>::compare_and_exchange_weak()

+0

它不會「比較T的一個實例」。標準中的措辭是它「比較你的對象佔用的內存的內容」,意味着對象類型被忽略。 – 2014-11-03 22:54:03

回答

3

在草案n3936中,memcmp語義在第29.6.5節中有明確的描述。

注意:例如,atomic_compare_exchange_strong的效果是 如果(memcmp(對象,預期,的sizeof(*對象))== 0) 的memcpy(對象,&需要的話,的sizeof(*對象)); else memcpy(expected,object,sizeof(* object));

注:memcpymemcmp語義比較和交換操作可以導致失敗的比較爲比較相等與operator==值如果底層類型具有填充比特,陷阱位或者具有相同值的替代表示。

至少自n3485以來至少存在該措詞。

請注意,只有memcmp(p1, p2, sizeof(T)) != 0compare_and_exchange_weak(保證失效)有意義。 memcmp(p1, p2, sizeof(T)) == 0允許但不保證成功。

0

它的實現已定義。它可能只是使用互斥鎖,或者它可能使用內存blob上的某些內在函數。該標準簡單地定義了它,使後者可以作爲實施策略。

編譯器在這裏什麼都不知道。它全都在圖書館裏。既然它是一個模板,你可以閱讀你的實現如何做。