最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

c++中的volatile和variant關(guān)鍵字詳解

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

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

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

template <class... Types>
class variant;

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

二、二者的功能

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

三、應(yīng)用實例

看一個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"); // 轉(zhuǎn)換構(gòu)造函數(shù)在無歧義時起作用
    x = "def"; // 轉(zhuǎn)換賦值在無歧義時亦起作用
 
    std::variant<std::string, void const*> y("abc");
    // 傳遞 char const * 時轉(zhuǎn)換成 void const *
    assert(std::holds_alternative<void const*>(y)); // 成功
    y = "xyz"s;
    assert(std::holds_alternative<std::string>(y)); // 成功
}

volatitle這個關(guān)鍵字給一個判斷的例程,就不給多線程的例程了,這玩意兒一般來說還是要小心使用,在多核,內(nèi)存序未知的情況下,還是不用為妙,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';
}

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

四、總結(jié)

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

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

相關(guān)文章

  • 共用體的定義與應(yīng)用詳細解析

    共用體的定義與應(yīng)用詳細解析

    共同體的定義類似結(jié)構(gòu)體,不過共同體的所有成員都在同一段內(nèi)存中存放,起始地址一樣,并且同一時刻只能使用其中的一個成員變量
    2013-08-08
  • 匯編語言rep movsd 的使用詳解

    匯編語言rep movsd 的使用詳解

    rep movsd 每次ecx!=0便執(zhí)行movsd ,然后ecx=ecx-1 movsd移動ds:[si] 到es:[di],在32位匯編下可以用esi代替si,edi代替di
    2013-09-09
  • 一文掌握C++ const與constexpr及區(qū)別

    一文掌握C++ const與constexpr及區(qū)別

    C++ 11標準中,const 用于為修飾的變量添加“只讀”屬性而 constexpr關(guān)鍵字則用于指明其后是一個常量,編譯器在編譯程序時可以順帶將其結(jié)果計算出來,而無需等到程序運行階段,這樣的優(yōu)化極大地提高了程序的執(zhí)行效率,本文重點介紹C++ const與constexpr區(qū)別介紹,一起看看吧
    2024-02-02
  • C語言操作符進階教程(表達式求值隱式類型轉(zhuǎn)換方法)

    C語言操作符進階教程(表達式求值隱式類型轉(zhuǎn)換方法)

    這篇文章主要為大家介紹了C語言操作符進階教程(表達式求值隱式類型轉(zhuǎn)換方法)
    2022-02-02
  • C語言 經(jīng)典題目螺旋矩陣 實例詳解

    C語言 經(jīng)典題目螺旋矩陣 實例詳解

    這篇文章主要介紹了C語言 經(jīng)典題目螺旋矩陣 實例詳解的相關(guān)資料,這里附有代碼實例及實現(xiàn)效果圖,需要的朋友可以參考下
    2016-12-12
  • C++實現(xiàn)銀行排隊系統(tǒng)

    C++實現(xiàn)銀行排隊系統(tǒng)

    這篇文章主要為大家詳細介紹了C++實現(xiàn)銀行排隊系統(tǒng),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • 基于C語言編寫一個簡單的Web服務(wù)器

    基于C語言編寫一個簡單的Web服務(wù)器

    C語言可以干大事,這篇文章主要為大家詳細介紹了如何基于C語言可以完成一個簡易的Web服務(wù)器,希望這篇文章會幫你你對C語言有更深入的理解
    2024-03-03
  • 使用C++實現(xiàn)跨進程安全的文件讀寫鎖

    使用C++實現(xiàn)跨進程安全的文件讀寫鎖

    在多進程系統(tǒng)中,文件的并發(fā)讀寫可能導(dǎo)致數(shù)據(jù)競爭、文件損壞等問題,為了確保多個進程能夠安全地訪問同一文件,我們需要使用文件鎖,本文將介紹如何使用 C++ 實現(xiàn)文件鎖,并確保文件的并發(fā)讀寫操作是安全的,需要的朋友可以參考下
    2025-02-02
  • C++文件關(guān)鍵詞快速定位出現(xiàn)的行號實現(xiàn)高效搜索

    C++文件關(guān)鍵詞快速定位出現(xiàn)的行號實現(xiàn)高效搜索

    這篇文章主要為大家介紹了C++文件關(guān)鍵詞快速定位出現(xiàn)的行號實現(xiàn)高效搜索,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-10-10
  • 舉例講解C語言鏈接器的符號解析機制

    舉例講解C語言鏈接器的符號解析機制

    鏈接器的工作主要分為兩個階段:符號解析和重定位,符號解析的功能是將每個模塊符號引用綁定到一個確切的符號定義,這里我們就來舉例講解C語言鏈接器的符號解析機制
    2016-05-05

最新評論

剑川县| 中西区| 东辽县| 石景山区| 滁州市| 鹤岗市| 股票| 临澧县| 固镇县| 米脂县| 五家渠市| 信宜市| 安溪县| 文安县| 泰和县| 梁河县| 澎湖县| 汝阳县| 墨竹工卡县| 开鲁县| 准格尔旗| 宜春市| 肥东县| 清流县| 新建县| 泸西县| 津市市| 诏安县| 定兴县| 敦煌市| 邢台县| 酒泉市| 淅川县| 阳新县| 嘉鱼县| 苗栗市| 南宁市| 长丰县| 札达县| 沽源县| 宿迁市|