文章目录
sta::atomic
最基本的原子整数类型
是std::atomic(可以使用预定义的别名std::atomic_bool),这是一个比std::atomic_flag功能更全的布尔标志,并且可以使用非原子的bool来赋值和初始化。
1 |
std<span class="token punctuation">:</span><span class="token punctuation">:</span>atomic<span class="token operator"><</span><span class="token builtin">bool</span><span class="token operator">></span> b<span class="token punctuation">(</span>true<span class="token punctuation">)</span><span class="token punctuation">;</span> b<span class="token operator">=</span>false<span class="token punctuation">;</span> |
要注意的是,原子类型赋值操作返回值而非引用。
与std::atomic_flag使用clear不同,std::atomic写(存储)操作是通过store来完成的;test_and_set也由exchange函数替代,它可以用新值替代原值,同时获取原值。std::atomic支持对值得无修改查询,通过隐式转换为普通得bool,或者调用load函数,load是一个载入操作。
1 |
std<span class="token punctuation">:</span><span class="token punctuation">:</span>atomic<span class="token operator"><</span><span class="token builtin">bool</span><span class="token operator">></span> b<span class="token punctuation">;</span> <span class="token builtin">bool</span> x<span class="token operator">=</span>b<span class="token punctuation">.</span>load<span class="token punctuation">(</span>std<span class="token punctuation">:</span><span class="token punctuation">:</span>memory_order_require<span class="token punctuation">)</span><span class="token punctuation">;</span> b<span class="token punctuation">.</span>store<span class="token punctuation">(</span>true<span class="token punctuation">)</span><span class="token punctuation">;</span> x<span class="token operator">=</span>b<span class="token punctuation">.</span>exchange<span class="token punctuation">(</span>false<span class="token punctuation">,</span>std<span class="token punctuation">:</span><span class="token punctuation">:</span>memory_order_acq_rel<span class="token punctuation">)</span><span class="token punctuation">;</span> |
auto类型用法总结
用途
auto是c++程序设计语言的关键字。用于两种情况
(1)声明变量时根据初始化表达式自动推断该变量的类型
(2)声明函数时函数返回值的占位符
auto可以在声明变量时根据变量初始值的类型自动为此变量选择匹配的类型。
举例:对于值x=1;既可以声明: int x=1 或 long x=1,也可以直接声明 auto x=1
用法
根据初始化表达式自动推断被声明的变量的类型,如:
1 |
auto f <span class="token operator">=</span> <span class="token number">3.14</span><span class="token punctuation">;</span> <span class="token operator">//</span>double auto s<span class="token punctuation">(</span><span class="token string">"hello"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token operator">//</span>const char<span class="token operator">*</span> auto z <span class="token operator">=</span> new auto<span class="token punctuation">(</span><span class="token number">9</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token operator">//</span><span class="token builtin">int</span> <span class="token operator">*</span> auto x1 <span class="token operator">=</span> <span class="token number">5</span><span class="token punctuation">,</span> x2 <span class="token operator">=</span> <span class="token number">5.0</span><span class="token punctuation">,</span> x3 <span class="token operator">=</span> <span class="token string">'r'</span><span class="token punctuation">;</span> <span class="token operator">//</span>错误,必须是初始化为同一类型 |
但是,这么简单的变量声明类型,不建议用auto关键字,而是应更清晰地直接写出其类型。
auto关键字更适用于类型冗长复杂、变量使用范围专一时,使程序更清晰易读。如:
1 |
std<span class="token punctuation">:</span><span class="token punctuation">:</span>vector<span class="token operator"><</span><span class="token builtin">int</span><span class="token operator">></span> vect<span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span>auto it <span class="token operator">=</span> vect<span class="token punctuation">.</span>begin<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> it <span class="token operator">!=</span> vect<span class="token punctuation">.</span>end<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token operator">+</span><span class="token operator">+</span>it<span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span> <span class="token operator">//</span>it的类型是std<span class="token punctuation">:</span><span class="token punctuation">:</span>vector<span class="token operator"><</span><span class="token builtin">int</span><span class="token operator">></span><span class="token punctuation">:</span><span class="token punctuation">:</span>iterator std<span class="token punctuation">:</span><span class="token punctuation">:</span>cin <span class="token operator">>></span> <span class="token operator">*</span>it<span class="token punctuation">;</span> <span class="token punctuation">}</span> |