91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

c++中的volatile和variant關鍵字怎么用

發布時間:2022-01-26 09:04:39 來源:億速云 閱讀:164 作者:iii 欄目:開發技術

這篇文章主要講解了“c++中的volatile和variant關鍵字怎么用”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“c++中的volatile和variant關鍵字怎么用”吧!

一、兩個長得有點像的變量

對volatile關鍵字,其實很多人只是能用,知道用到啥處,但其實應用的原理并不知道。在一些多線程的通信中,往往是這個關鍵字應用到的場所,很多人也是如此想的。但其實這個想法是不準確的。volatile這個關鍵字的目的最初是針對硬件IO操作的,防止訪問IO操作中的緩存影響到真實的數據。但這個關鍵字的溢出效應是,多線程也可以應用這個原理(注意在多核和多CPU編程中有危險,但是在其它語言如Java中,得按具體的語言規范來決定),那么反而在硬件IO中的應用成了一種比較少的應用場景。
在c++17中,還有一個長得和它類似的聯合體variant,如果有其它語言中var變量的使用,就大概明白了這是個啥玩意兒。既然是聯合體,那么就明白了這個關鍵字的用處了,也就是說,它可以表示明確的類型定義,而在前面提到的std::any則不是。看一下在c++17中它的標準定義:

template <class... Types>
class variant;

之所以把它們兩個搞在一起,是有的時候兒新手小菜鳥可能會把兩個傻傻分不清。

二、二者的功能

類模板 std::variant 表示一個類型安全的聯合體,它表示可以擁有其中的任何一個類型或者無值,它不能保有引用、數組或者void,如果表示一個空值,也要用std::variantstd::monostate 代替。同樣,在默認構造時,默認保有聯合體的第一個類型。面std::volatile則更多傾向于一個編譯器的優化選項處理,它會防止變量被編譯器緩存。正如前面所講,這個在多線程中應用的比較多,但其實他更安全的應用其實是在硬件IO操作中。
這么看來,這二者的區別還是相當明顯的,別看長得乍一看有點像,但還真不是一嘛事兒。只要寫一回代碼估計就記清楚了。或者簡單的記憶成volatile是一個關鍵字,而variant是一個復合類型,是一個聯合體,是一個類模板。

三、應用實例

看一個variant的例程:

#include <variant>
#include <string>
#include <cassert>
 
int main()
{
    std::variant<int, float> v, w;
    v = 12; // v 含 int
    int i = std::get<int>(v);
    w = std::get<int>(v);
    w = std::get<0>(v); // 與前一行效果相同
    w = v; // 與前一行效果相同
 
//  std::get<double>(v); // 錯誤: [int, float] 中無 double
//  std::get<3>(v);      // 錯誤:合法下標值為 0 與 1
 
    try {
      std::get<float>(w); // w 含 int 而非 float :將拋出
    }
    catch (const std::bad_variant_access&) {}
 
    using namespace std::literals;
 
    std::variant<std::string> x("abc"); // 轉換構造函數在無歧義時起作用
    x = "def"; // 轉換賦值在無歧義時亦起作用
 
    std::variant<std::string, void const*> y("abc");
    // 傳遞 char const * 時轉換成 void const *
    assert(std::holds_alternative<void const*>(y)); // 成功
    y = "xyz"s;
    assert(std::holds_alternative<std::string>(y)); // 成功
}

volatitle這個關鍵字給一個判斷的例程,就不給多線程的例程了,這玩意兒一般來說還是要小心使用,在多核,內存序未知的情況下,還是不用為妙,X86因為一些歷史原因,用起來還是比較可以接受的:

#include <iostream>
#include <type_traits>
 
int main() 
{
    std::cout << boolalpha;
    std::cout << std::is_volatile<int>::value << '\n';
    std::cout << std::is_volatile<volatile int>::value  << '\n';
}

這個關鍵字對從Java轉過來的開發人員可能有非常大的迷惑性,二者的理解意義還是有比較大的不同的。把內存序掌握好了,就知道為什么在X86的PC上跑一般沒有問題的原因,如果還是無法清楚,就好好看看c++標準中對內存序的支持。這個一定要搞明白,搞不明白的話,可能不會影響到編程,但會影響到對標準的認知。

感謝各位的閱讀,以上就是“c++中的volatile和variant關鍵字怎么用”的內容了,經過本文的學習后,相信大家對c++中的volatile和variant關鍵字怎么用這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

固始县| 鄂州市| 西和县| 胶州市| 米脂县| 寿阳县| 东乡| 普定县| 桂林市| 大新县| 错那县| 南康市| 秀山| 长沙市| 南和县| 新乡县| 岚皋县| 乌拉特后旗| 梅河口市| 岗巴县| 沽源县| 常德市| 昌吉市| 呼玛县| 漳浦县| 桐柏县| 南昌县| 赤壁市| 怀远县| 上虞市| 塔河县| 图木舒克市| 磴口县| 黎城县| 仲巴县| 衡南县| 浦东新区| 庄浪县| 庐江县| 平罗县| 恩平市|