对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 <casrt> 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 namespa什么叫自然数ce std::literals; std::variant<std::string> x("abc"); // 转换构造函数在无歧义时起作用 x = "def"; // 转换赋值在无歧义时亦起作用 std::variant<std::string, void const*> y("abc"); // 传递 char const * 时转换成 void const * asrt(std::holds_alternative<void const*>(y)); // 成功 y = "xyz"s; asrt(std::holds_alternative<std::string>(y)); // 成功}
volatitle这个关键字给一个判断的例程,就不给多线程的例程了,这玩意儿一般来说还是要小心使用,在多核,内存序未知的情况下,还是不用为妙,x五年级上册数学期中考试卷86因为一些历史原因,用起来还是比较可以接受的:
#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关键字内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!
本文发布于:2023-04-04 18:41:07,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/ac140c6facd9f29a033b46acfb8ce03f.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:c++中的volatile和variant关键字详解.doc
本文 PDF 下载地址:c++中的volatile和variant关键字详解.pdf
留言与评论(共有 0 条评论) |