簡體   English   中英

易失性成員函數(C ++)

[英]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限定符聲明的成員函數。 只能為非易失性對象調用非易失性成員函數。

http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8a.doc%2Flanguage%2Fref%2Fcplr028.htm

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM