[英]Volatile Member Functions (C++)
鑒於以下課程:
class MyClass {
public:
int value() const {
return value_;
}
private:
volatile int value_;
};
是否還必須將value()成員函數標記為volatile以避免被優化掉或者寫得好嗎? 謝謝。
它完全類似於const
工作原理。
如果你有一個const
對象,只有標記為const
成員函數是可調用的。
所以...
如果您有一個volatile
對象,則只有標記為volatile
成員函數才是可調用的。
只要對象本身volatile
,函數是否正常就沒有區別。
但是,請記住volatile
與多線程無關 ,它不會幫助您編寫線程安全的代碼。 對於任何與並發相關的東西,它都是錯誤的工具。
是否還必須將value()成員函數標記為volatile以避免被優化掉或者寫得好嗎?
將成員函數標記為volatile將不會影響它是否被優化。 寫得很好。
擔心的是我是否有MyClass c; 然后調用c.value(); 有幾次,編譯器可能認為c.value()會返回相同的值(即使它可能已經改變了......)
聽起來你想要的是學習原子變量。 看一下std :: atomic。
如果您真的想了解volatile,請閱讀本文: http : //www.cs.utah.edu/~regehr/papers/emsoft08-preprint.pdf
擔心的是我是否有MyClass c; 然后調用c.value(); 有幾次,編譯器可能認為c.value()會返回相同的值(即使它可能已經改變了......)
在單獨的編譯模型中,編譯器沒有看到函數的內部,它不能假設它們不會有副作用([*]),因此無法刪除對函數的不同調用。 如果編譯器看到函數的定義並內聯代碼,那么它會發現該成員是volatile
,因此無法對其進行優化。
[*]有些編譯器(即gcc)有一些特殊的屬性可以用來告訴它函數是純的 (即它沒有副作用,輸出只依賴於提供的參數)來啟用對函數的多次調用優化了,例如在這個循環中:
const char* lit = "Literal";
int sum = 0;
for ( int i = 0; i < strlen(lit); ++i ) {
sum += lit[i];
}
因為strlen
在庫中標記為純,所以編譯器將緩存該值並將循環轉換為:
const char* lit = "Literal";
int sum = 0;
int __len = strlen(lit);
for ( int i = 0; i < __len; ++i ) {
sum += lit[i];
}
但是庫必須具體告訴編譯器可以這樣做。 如果沒有屬性形狀的額外信息,則不能假設任何內容,並且必須在循環的每次迭代中調用strlen
函數。
常量和volatile成員函數(僅限C ++)
可以為常量和非常量對象調用使用const限定符聲明的成員函數。 只能為非常量對象調用非常量成員函數。 類似地,可以為volatile和非易失性對象調用使用volatile限定符聲明的成員函數。 只能為非易失性對象調用非易失性成員函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.