2012-12-13 233 views
3

我在寫一個需要同時支持易失性和非易失性實例的類(易失性實例使用原子操作,非易失性實例使用常規操作),並且想知道如果我我正在以正確的方式去解決它。下面是類聲明的SNIPPIT至今:爲易失性和非易失性實例重載類

class Yield { 
public: 
    Yield(); 
    Yield(Yield const &other); 
    Yield(Yield const volatile &other); 

    Yield &operator=(Yield const &other); 
    Yield &operator=(Yield const volatile &other); 

    Yield &operator+=(Yield const &other); 
    Yield &operator+=(Yield const volatile &other); 
    Yield volatile &operator+=(Yield const &other) volatile; 
    Yield volatile &operator+=(Yield const volatile &other) volatile; 

    // Other operators snipped... 
}; 
  • 問題1:當MSVC編譯,我得到以下警告:

    warning C4521: 'util::Yield' : multiple copy constructors specified

    該警告預示着任何問題使用這個類?還是可以安全地忽略它?

  • 問題2:就目前而言,所有操作符都會因爲volatile和non-volatile other參數而被重載。我認爲這是必要的,以避免對非易失性實例進行較慢的易失性訪問?是否有替代方案允許每種方法只能被編碼兩次(易失性1小時和非易失性1小時)而不是4次(易失性和非易失性1小時,每種都有易失性和非易失性右旋糖)?

我希望把這些問題放在一起是好的,否則請留下評論,我可以將它們分開。 謝謝!

回答

2

Volatile does not do what you think it does

即使有VC++的特殊,非標volatile行爲,這導致更慢的代碼比正常寫它。使用std::atomic,或者如果這不可用,那麼你可能已經獲得了特定於平臺的屏障,柵欄和原子內在函數。 VC++有_ReadWriteBarrier_Interlocked函數來幫助你。

+0

是的,我知道易失性不會自動提供安全的多線程,我只是想用它來區分需要原子操作(何時共享實例)和何時不(實例僅在本地使用)。不必多次複製代碼將是很好的,但到目前爲止其他的變化例如使用模板更加醜陋。 – zennehoy

+0

'volatile'不提供任何多線程功能,也不提供任何原子性。考慮命名你的函數_atomic或類似的東西,而不是使用'volatile''這個',這樣讀取你的代碼的人可以告訴它做了什麼。 –

3

該類具有單個類型的多個拷貝構造函數。此警告是信息性的;構造函數在您的程序中可調用。

從MSDN網站:Compiler Warning (level 3) C4521

+3

我編輯了你的答案,以提供我認爲你的意思是回答他的問題的部分。下次更好地提供可以回答問題的部分,而不僅僅是鏈接到網站。 – Rutix