随笔分类 -  C++

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

点击右上角即可分享
微信分享提示