
C++新特性
文章平均质量分 58
金色熊族
这个作者很懒,什么都没留下…
展开
-
理解原子变量之四:可见性、memory_order_acquire与 memory_order_release
则b线程读取该原子变量后,不仅可以看到该原子变量的更新值(也就是a线程写入的值),还能看到a线程对该原子变量进行写入之前的所有其他的写操作的效果,不论是针对该原子变量的,还是针对其他变量的,也不论这些变量是不是原子变量,也不论使用何种内存序。里的实例3里面,我们看到,如果在一个线程里修改原子变量done,另一个线程读取done时,就会看到这个变化。这就是原子变量的可见性。1 a线程对某原子变量进行了写入操作,且使用了内存序memory_order_release,最重要的是红线标出的这句话。原创 2024-11-23 18:51:33 · 469 阅读 · 0 评论 -
理解原子变量之三:原子性与memory_order_relaxed
在一位C++大神 “高效程序员” 的公众号里,有这么一篇文章介绍原子变量《C++11开发中的Atomic原子操作》。里面有这么一段话:“...原子操作,基本都包含...三个方面...的语义:操作本身是不可分割的(Atomicity),一个线程对某个数据的操作何时对另一个线程可见(Visibility),执行的顺序是否可以被重排(Ordering)”。Atomicity翻译过来就是原子性,Visibility翻译过来就是可见性。本文在前面两篇文章的基础上,进一步讲述原子性的含义。原创 2024-11-23 14:55:34 · 363 阅读 · 0 评论 -
理解原子变量之二:从volatile到内存序-进一步的认识
实例1,2,3都是在vs2013下演示的。即使遵循相同的C++标准,不同的编译器对同一个标准的贯彻程度也不一样:有的编译器严格遵循标准,既不多做,也不少做;对照实例1,在不使用volatile的情况下,子线程workerThread对done的修改,没有影响到主线程的while(!编译器意识不到子线程也在改变done的取值,所以就认为done是常量,而不会在运行到while()时读取done的实际值,于是while(!反观实例2和3,子线程修改了done,主线程的运行随之受了影响,这就是可见。原创 2024-11-03 11:30:09 · 1063 阅读 · 0 评论 -
理解原子变量之一:从互斥锁到原子变量,最粗浅的认识
多线程编程对于程序员来说,是一项非常重要的技能。在C++11标准问世之前,C++标准是不支持多线程的。在C++11出台前,如果你想在linux平台进行多线程编程,就要使用linux的多线程库pthread,而pthread是按照POSIX标准实现的,与C++标准无关。在C++11标准下,你可以使用std::thread,实现多线程编程。但是,多线程编程涉及的不仅仅是thread,编程者也要考虑资源竞争的情形,这就涉及到互斥锁、信号量等。这些也包含在c++11中。原创 2024-11-01 13:34:34 · 883 阅读 · 0 评论 -
std::bind与std::ref配合使用时要注意的几个问题
在前面的博客,我们看到假如std::bind的输入函数的输入变量是引用类型,则我们可以在std::bind中用std::ref修饰它们。原创 2024-06-23 15:52:46 · 310 阅读 · 0 评论 -
浅析std::ref
根据等消息来源的描述,需要std::ref的场景主要是如下三种:假如std::thread需要调用一个函数,且这个函数的输入参数是引用的话,则std::thread对这个参数的调用必须用ref修饰。假如sid::bind需要调用一个函数,且这个函数的输入参数是引用的话,则std::bind对这个参数的调用必须用ref修饰。stl库调用,比如for_each的输入参数里也可以有一个函数指针。假如这个函数的输入参数是一个引用,则函数指针也要用std::ref修饰。下面通过几个实例来验证以上描述的真伪。原创 2024-06-23 15:31:13 · 1189 阅读 · 0 评论 -
理解移动语义(七)--返回值优化
返回值优化原创 2023-04-02 22:45:39 · 944 阅读 · 0 评论 -
理解移动语义(六)--std::forward和std::move
std::forward和std::move原创 2023-04-02 21:30:04 · 162 阅读 · 0 评论 -
理解移动语义(五)--左右值判断的常见错误
c++判断左右值类型遵循这样一条规则:只看调用现场的情况,不看以前的来源原创 2023-04-02 18:09:57 · 240 阅读 · 0 评论 -
理解移动语义(四)--引用折叠
T && 和 auto &&的引用折叠原创 2023-04-02 17:14:52 · 189 阅读 · 0 评论 -
理解移动语义(三)--万能引用
属于和不属于万能引用的情况原创 2023-04-01 15:55:22 · 258 阅读 · 0 评论 -
理解移动语义(二)--延长变量的生命周期
有右值引用,生命周期延长到引用的生命周期结束时原创 2023-04-01 15:13:53 · 450 阅读 · 0 评论 -
理解移动语义(一)左值和右值
左值和右值C++原创 2023-04-01 14:36:20 · 213 阅读 · 0 评论 -
c++的“构造”与“赋值”之辨
在某个微信交流群里,有人求助如下问题:其实乙的回答是中肯的。并不是带等号的一定是赋值操作。假如:A a, b;a = move(b);那么确实是移动赋值操作,因为A已经被构造过了。但是在本例中,a的声明和等号一起出现,此时算是移动构造,不算赋值。看下面的实际例子:#include <iostream>#include <utility>class A{public: A(){ a=0; std::.原创 2022-04-10 19:39:38 · 838 阅读 · 0 评论 -
C++格式化数字输入字符串的几个办法
1 最为熟知的就是sprintf了,不多说。2 假如你用Qt的话,还可以用QString::arg()方法3 这里着重讲讲std::stringstream。它是C++17标准引进的。详情可见integer - Convert a number to a string with specified length in C++ - Stack Overflowhttps://stackoverflow.com/questions/225362/convert-a-number-to-a-strin原创 2021-10-16 14:56:09 · 1199 阅读 · 0 评论 -
C++11运行时类型识别(RTTI)示例
示例出处是Michael Wong的著作《深入理解C++11》代码清单4-16,略有改动。#include <iostream>#include <typeinfo>struct white {};struct black {};int main(void){ white a; white c; black b; std::cout << typeid(a).name() << std::endl; std::cout <&l原创 2021-10-16 14:30:23 · 248 阅读 · 0 评论 -
探讨侯捷老师关于variadic template讲义的一处表述
最近在学习侯捷老师的c++视频。其中关于variadic template的讲义25:00处的一处讲述似乎不对,特地拿出来与大家探讨。视频源https://www.youtube.com/watch?v=TJIb9TGfDIw&list=WL&index=4&t=1414shttps://www.youtube.com/watch?v=TJIb9TGfDIw&list=WL&index=4&t=1414s在第25分钟处,侯老师说,当args...有零个参数原创 2021-10-05 16:58:22 · 158 阅读 · 0 评论 -
解答《Linux多线程服务端编程:使用muduo c++网络库》1.9节末的问题
在陈硕的著作《》1.9节末,提出一个问题:如何在临界区以外销毁资源?这里给出两个解法。二者只有两句话次序前后的区别,但是一个正确,一个错误。目录正确的解法代码结果错误的解法代码结果结论正确的解法代码#include <QCoreApplication>#include <QMutex>#include <memory>#include <QDebug>class CLock {public:..原创 2021-08-08 15:17:30 · 242 阅读 · 2 评论 -
常引用不会增加shared_ptr的计数
起始这个不难理解:拷贝shared_ptr才会增加计数。下面实际验证一下:代码#include <memory>#include <iostream>auto sp = std::make_shared<int>(1);int iTime100(const std::shared_ptr<int> & spTemp)//const reference{ std::cout << "inside "<< __原创 2021-08-08 14:47:24 · 433 阅读 · 0 评论 -
shared_ptr::swap, reset的用法示例
在陈硕所著的<<Linux多线程服务端编程:使用muduo c++网络库>>一书1.19节中,介绍了c++的shared_ptr的函数swap和reset的用法。本文通过两个小程序示例这两个程序各自的作用。swap()代码:#include <memory>#include <iostream>class Bar { public: ~Bar(){ std::cout << "destroying"; } };int mai原创 2021-08-08 14:28:16 · 2568 阅读 · 0 评论 -
利用std::async实现异步功能
c++ 11标准推出了多线程功能。其中我比较喜欢的是把async和future联合起来使用,实现异步功能。首先介绍async的使用办法输入参数第一个参数是启动线程的策略,有3个选项:std::launch::async, std::launch::deferred,以及std::launch::async| std::launch::deferred。std::launch::async选项表明,std::async被调用之后就将启动线程(尽管具体的启动时间点不确定,因为线程调用受操作系统支原创 2021-07-11 14:41:00 · 632 阅读 · 0 评论 -
一种罕见但方便的数组初始化方法
最近在浏览微信公众号”裸机思维“时,学到一种新的数组初始化方法。现分享给大家。例子一原创 2021-06-06 17:58:38 · 154 阅读 · 2 评论 -
unique_ptr的用法
1.从一个unique_ptr直接赋值给另一个unique_ptr是合法的,比如ptr = std::unique_ptr(new ClassA)出处原创 2021-04-29 18:32:59 · 7172 阅读 · 0 评论 -
如何从类的外部获取其成员函数的指针?
在C++11标准之前,从类的外部获取其成员函数的指针是行不通的,除非这个函数是静态成员。但是现代c++提供了<functional>库,使得这个路子走通了。具体例子见https://stackoverflow.com/questions/12662891/how-can-i-pass-a-member-function-where-a-free-function-is-expected#include <functional>#include <stdio.h>原创 2021-02-25 20:09:12 · 369 阅读 · 0 评论 -
移动语义使用指南(二)-- 小心std::move 与 vector::push_back 一起使用的坑
目录问题描述三种异常保证附录问题描述Std::move是移动语义特性的一部分。移动语义在c+ 11标准中被引入,目的是提高程序运行的效率,把以前一些需要“先拷贝,再删除源对象”的操作,转化为直接把源对象移动到目标位置。但是再CppCon 2019的演讲(https://www.youtube.com/watch?v=St0MNEU5b0o&t=2171s 第29分钟)中,Klaus Iglberger提出,使用 vector::push_back 时,假如move con..原创 2021-02-03 20:37:39 · 3594 阅读 · 0 评论