欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

c++中的volatile和variant關鍵字詳解

 更新時間:2022年01月25日 17:06:33   作者:fpcc  
大家好,本篇文章主要講的是c++中的volatile和variant關鍵字詳解,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下

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

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

template <class... Types>
class variant;

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

二、二者的功能

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

三、應用實例

看一個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"); // 轉換構造函數(shù)在無歧義時起作用
    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轉過來的開發(fā)人員可能有非常大的迷惑性,二者的理解意義還是有比較大的不同的。把內存序掌握好了,就知道為什么在X86的PC上跑一般沒有問題的原因,如果還是無法清楚,就好好看看c++標準中對內存序的支持。這個一定要搞明白,搞不明白的話,可能不會影響到編程,但會影響到對標準的認知。

四、總結

俗話說:“看一遍不如寫一遍”,這句話在計算機行業(yè)應該是非常合適的。計算機技術是一門理論科學與實踐高度結合的技術,理論是源泉,實踐是根本,互相反饋,不斷迭代,這才是真正提高編程水平的王道。
努力吧,歸來的少年

到此這篇關于c++中的volatile和variant關鍵字詳解的文章就介紹到這了,更多相關c++ volatile和variant關鍵字內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C++紅黑樹應用之手搓set和map

    C++紅黑樹應用之手搓set和map

    這篇文章主要為大家詳細介紹了如何使用紅黑樹封裝set和map,且必須保證兩種數(shù)據結構復用同一棵紅黑樹,且滿足set和map的性質,set的value不可被改變,而map的value可以被改變,需要的可以參考一下
    2023-03-03
  • C語言聯(lián)合體類型的實現(xiàn)

    C語言聯(lián)合體類型的實現(xiàn)

    聯(lián)合體也是一種構造數(shù)據類型,和結構體類型一樣,它也是由各種不同類型的數(shù)據組成,本文主要介紹了C語言聯(lián)合體類型的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2024-02-02
  • C語言中左移和右移運算符詳細介紹

    C語言中左移和右移運算符詳細介紹

    這篇文章主要介紹了C語言中左移和右移運算符詳細介紹的相關資料,需要的朋友可以參考下
    2017-05-05
  • C++數(shù)據結構與算法之雙緩存隊列實現(xiàn)方法詳解

    C++數(shù)據結構與算法之雙緩存隊列實現(xiàn)方法詳解

    這篇文章主要介紹了C++數(shù)據結構與算法之雙緩存隊列實現(xiàn)方法,結合實例形式分析了雙緩存隊列的原理、實現(xiàn)方法與相關注意事項,需要的朋友可以參考下
    2017-08-08
  • C語言實現(xiàn)貪吃蛇游戲演示

    C語言實現(xiàn)貪吃蛇游戲演示

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)貪吃蛇游戲演示,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • cocos2dx-3.10 C++實現(xiàn)滾動數(shù)字

    cocos2dx-3.10 C++實現(xiàn)滾動數(shù)字

    這篇文章主要為大家詳細介紹了cocos2dx-3.10 C++實現(xiàn)滾動數(shù)字效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-09-09
  • C語言中#pragma?pack(1)的用法與注意點

    C語言中#pragma?pack(1)的用法與注意點

    #pragma用于指示編譯器完成一些特定的動作,下面這篇文章主要給大家介紹了關于C語言中#pragma?pack(1)的用法與注意點的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-02-02
  • C++鏈表實現(xiàn)通訊錄設計

    C++鏈表實現(xiàn)通訊錄設計

    這篇文章主要為大家詳細介紹了C++鏈表實現(xiàn)通訊錄設計,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • C++超詳細講解auto與nullptr的使用

    C++超詳細講解auto與nullptr的使用

    C++11提供了nullptr用來取代0或者NULL。在C++11之前,使用NULL為空指針賦初值,但NULL其實就是0,這時會把NULL當成0來用;在C++11中,我們在聲明一個變量或對象,指定它的類型時,可以不使用變量本身的類型而使用auto替代
    2022-05-05
  • C++中的Lambda表達式詳解

    C++中的Lambda表達式詳解

    這篇文章主要介紹了C++中的Lambda表達式詳解,本文講解了基本語法、Lambda的使用等內容,需要的朋友可以參考下
    2014-10-10

最新評論