随笔分类 - C++
C++好难,忘的好快,还是整理下吧
摘要:编写线程池时遇到的问题 初版 detach的错误写法:detach将主线程和工作线程分离,线程在结束运行时自行释放所占用的内存资源,但带来的问题是主线程结束后销毁线程池,导致与工作线程共享的资源被销毁,工作线程访问已经被销毁的资源,导致程序崩溃。 #include<iostream> #includ
阅读全文
摘要:C++ type traits 学习 从integral_constant引入 integral_constant是一个模板类,用于表示一个常量值,它的定义如下: /// integral_constant template<typename _Tp, _Tp __v> struct integra
阅读全文
摘要:协程杂记 协程是什么 协程是一种协作式多任务模型,不同于线程的抢占式多任务模型。协程是由程序员自己控制的,可以在任意时刻挂起或者恢复一个协程,更适合于用来实现彼此熟悉的程序组件。 在通常使用线程的情景中,负责处理不同任务的线程之间存在着数据竞争,使用加锁可以解决问题,但其实并不符合我们的本意。以生产
阅读全文
摘要:c++ 相关杂项 nullptr C语言中NULL定义为(void *)0,可以隐式转换为指针类型;但C++中NULL定义为0(强类型语言,void*不能转化为其他指针类型,因此修改了定义),可以隐式转换为整数类型和指针类型。为了解决函数重载时NULL的二义性,C++11中引入了nullptr关键字
阅读全文
摘要:今天设计一个类时,根据需求在网上学到了单例模式,重新梳理了private构造析构函数的作用。 构造函数和析构函数 private 私有成员只能在类域内被访问,不能在类域外进行访问。 无论将构造函数还是虚构函数设置为private,都可以防止外部创建栈对象,而只能由类的成员函数创建(实际上只能由类的静
阅读全文
摘要:起因是做gitlet读取文件内容时遇到的内容不匹配错误,后来发现是自己读取文件内容时均使用getline函数,写回时读入的每个字符串都加上换行符,导致文件末尾可能多出换行符。 于是改成了 vector<string> Blob::readContentsForBlob(const string& f
阅读全文
摘要:std::thread thread() noexcept 创建一个空线程对象,什么也不做 template <class Fn, class… Args> explicit thread(Fn&& fn, Args&&… args) 创建线程,以 fn(args…) 作为线程函数执行 Fn 必须是
阅读全文
摘要:右值 每个 C++ 表达式都有一个类型,属于值类别。 值类别是编译器在表达式计算期间创建、复制和移动临时对象时必须遵循的规则的基础。 C++17的值类别有: glvalue (generalized lvalue):表示对象身份的表达式,如变量名、函数名、类名等(包括具名右值引用,匿名右值引用比如s
阅读全文
摘要:copy elision是指编译器为了优化,将不需要的copy操作直接省略了。比如函数返回值的copy操作和构造函数的copy操作等。 例子如下 #include<iostream> using namespace std; class A{ public: A(){ cout<<"default
阅读全文
摘要:可调用对象 函数 函数指针 函数类 lamda表达式 bind对象 函数类 重载了函数调用运算符()的类的对象,称为函数对象,也叫仿函数。 class callable { public: void operator() (int x) const { cout << "callable::oper
阅读全文
摘要:static_cast static_cast(expression) 用于非多态类型的低风险转换,如基类和派生类之间的转换,基本数据类型之间的转换(包括任何隐式转换),用户自定义转换,把void指针转换成目标类型的指针等。不进行运行时类型检查,只在编译时检查。 具体如下 用于类层次结构中基类和派生
阅读全文
摘要:C 可变参数 typedef char* va_list; void va_start ( va_list ap, prev_param ); type va_arg ( va_list ap, type ); void va_end ( va_list ap ); // 32位机器对int大小向上
阅读全文
摘要:运行时类型识别即RTTI主要由以下两个运算符实现 typeid,返回表达式类型 dynamic_cast,将基类指针或引用安全地转换成派生类指针或引用 运算符会自动使用指针或引用对象的动态类型。特别适用于想用基类指针或引用来执行派生类的不是虚函数的操作,即无法使用虚函数的情况。但实际上尽可能定义虚函
阅读全文
摘要:RAII(Resource Acquisition Is Initialization)翻译过来就是资源获取即初始化,更准确的表达是使用对象来管理资源。 单纯依靠new和delete的期望执行是行不通的,甚至有时会有隐藏new的资源(比如函数返回的资源)。因此我们寄希望于析构函数自动调用的机制来确保
阅读全文