2014-02-13 27 views
3

標準算術運算符(如*+)按預期的方式在像atomic<int>這樣的類上運行。但是,我無法在<atomic>頭文件中找到它們的定義,也沒有在標準中引用它們。何處/如何定義原子< T >的算術運算符?

它們是在什麼地方隱式定義的,還是我只是看錯了地方?

例如,下面代碼中調用的乘法函數定義在哪裏?

#include <iostream> 
#include <atomic> 
using namespace std; 

int main() { 

    atomic<int> i(42); 
    atomic<float> f(6.66); 

    cout << i * f; 
    //cout << operator*(i, f); //error: ‘operator*’ not defined 

    return 0; 
} 

對於其他人閱讀這個問題有什麼關於here去的一個很好的討論。

回答

2

atomic類型都有一個轉換operator T讀取原子 - 在i * f表達他們同時讀取原子,此後提取的值 - 在CPU寄存器保持 - 是純intfloat類型的並乘以按照任何其他對的intfloat,結果提供給operator<<float過載。

請記住,原子性的整個想法是關於加載和存儲內存中的值的方式,使讀者不會看到一半寫入的值,並且作者不會重疊,只留下內存中某些混合的兩個值。一旦將一個原子值加載到某個表達式中某個實際使用的寄存器中,或者將其作爲一個函數參數,則其他線程將無法訪問該原子值,或者通過寫入原始變量來更新該原子值。

+0

謝謝,我從來沒有遇到過這些'運算符T()'函數。他們是否有技術名稱?我想看看他們的標準。 –

+1

@ andrew.punnett不客氣。你需要「轉換功能」 - 見12.3和12.3.2。乾杯。 –

+0

謝謝,我想他們非常類似於重載的C風格的演員功能。 –

1

atomic<T>規定operator T()。然後內置的運算符可以愉快地應用到底層的基本類型中。