溫馨提示×

溫馨提示×

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

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

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

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

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

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

對volatile關鍵字,其實很多人只是能用,知道用到啥處,但其實應用的原理并不知道。在一些多線程的通信中,往往是這個關鍵字應用到的場所,很多人也是如此想的。但其實這個想法是不準確的。volatile這個關鍵字的目的最初是針對硬件IO操作的,防止訪問IO操作中的緩存影響到真實的數(shù)據(jù)。但這個關鍵字的溢出效應是,多線程也可以應用這個原理(注意在多核和多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ū)別還是相當明顯的,別看長得乍一看有點像,但還真不是一嘛事兒。只要寫一回代碼估計就記清楚了?;蛘吆唵蔚挠洃洺蓈olatile是一個關鍵字,而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++標準中對內存序的支持。這個一定要搞明白,搞不明白的話,可能不會影響到編程,但會影響到對標準的認知。

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

向AI問一下細節(jié)

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

AI