![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
C++
文章平均质量分 72
C++相关
Owl丶
这个作者很懒,什么都没留下…
展开
-
C++实现线程池
#ifndef THREAD_POOL_H#define THREAD_POOL_H#include <condition_variable>#include <functional>#include <future>#include <memory>#include <mutex>#include <queue>#include <stdexcept>#include <thread>#i转载 2021-09-07 15:57:57 · 362 阅读 · 0 评论 -
基于muduo的简单静态WebServer
https://github.com/836662398/MyWebServerMyWebServerIntroduction基于muduo网络库的C++ 高性能简单静态web服务器。对muduo进行了一些优化:添加了心跳检测;尽量使用C++标准库,减少了代码量;简化了定时器实现,使用堆而不是基于红黑树的set;分别实现 epoll ET/LT两种模式(位于不同branch);…此外,日志模块使用了spdlog库,单元测试使用了gtest库。Envoirment原创 2021-03-19 21:06:22 · 831 阅读 · 0 评论 -
《Linux多线程服务端编程:使用muduoC++网络库》学习笔记
boost库安装:apt-cache search boost搜到所有的boost库然后:sudo apt-get install libboost-all-dev安装相应的库第一章 线程安全的对象生命期管理1.1 当析构函数遇到多线程C++多线程对象的销毁可能会碰到竞态条件,解决办法是使用shared_ptr。1.1.1 线程安全的定义1.1.2 MutexLock与MutexLockGuard#include<bits/stdc++.h>#include<b原创 2021-02-02 21:36:34 · 2504 阅读 · 1 评论 -
《Effective Modern C++》笔记
绪论一种有启发性地判断一个表达式是左值的方法是检查是否可以取得该表达式的地址。如果可以取地址,它基本上就是一个左值。如果不行,通常来说是一个右值。这种方法之所以说复用启发性,是因为他让你记得,表达式的型别与它是左值还是右值没有关系。形参只能是左值,但是作为其初始化依据的实参即有可能是右值也有可能是左值。...原创 2021-01-27 20:49:05 · 825 阅读 · 1 评论 -
C++多线程日志库spdlog使用
#include "spdlog/sinks/rotating_file_sink.h"#include "spdlog/spdlog.h"class LOG {public: //配置日志文件、写入模式 LOG() { //日志模块名、日志文件最大大小、滚动文件数量(日志太多的时候,当前文件重命名_1,_2,_3.再写新的文件) auto logger = spdlog::rotating_logger_mt("log", "log/Srio.txt", 2 * 1024 * 1024原创 2021-01-14 19:37:18 · 4288 阅读 · 0 评论 -
CMake笔记
相关命令#运行当前目录下的cmake文件cmake . #运行父目录下的cmake文件,并在当前目录生成相关文件,通常位于build文件夹cmake ..#执行makefilemake#删除make出的elf文件make cleanCMake教程简例# CMake 最低版本号要求cmake_minimum_required (VERSION 2.8)# 项目名称project (echo)# 指定生成目标,包含所有源文件add_executable(echo main原创 2020-12-29 12:16:58 · 567 阅读 · 0 评论 -
C++内存泄漏、数组越界……检测工具:Sanitizers
g++ gcc自带的sanitizers可用于检测内存泄漏、数组越界、线程竞态条件、未初始化等问题,暂时只支持Linux。用法:https://blog.csdn.net/weixin_41644391/article/details/103450401CMAKE中的用法:Google sanitizersSanitizers are open-source tools for dynamic code analysis designed by Google. CLion integrates w转载 2020-11-03 14:53:19 · 4958 阅读 · 0 评论 -
《Effective C++》 笔记
导读被声明为explicit的构造函数通常比其non-explici兄弟更受欢迎,因为它们禁止编译器执行非预期(往往也不被期望)的类型转换。**除非我有一个好理由允许构造函数被用于隐式类型转换,否则我会把它声明为explicit。**我鼓励你遵循相同的政策。copy构造和copy赋值的区别:如果一个新对象被定义(例如以上语句中的w3),一定会有个构造函数被调用,不可能调用赋值操作。如果没有新对象被定义(例如前述的"w1=w2"语句),就不会有构造函数被调用,那么当然就是赋值操作被调用。函数Pass原创 2020-10-11 21:33:02 · 774 阅读 · 0 评论 -
C++11智能指针用法
shared_ptr和unique_ptr都支持的操作:shared_ptr创建默认初始化:保存空指针shared_ptr<T> p1;创建方式:shared_ptr<T> p1(T* ptr);//构造函数,示例如下shared_ptr<T> p1(new T());shared_ptr<T> p2 = make_shared<T>(args);shared_ptr<T> p3(p2); //拷贝构造,会增加p2原创 2020-10-05 20:16:36 · 772 阅读 · 0 评论 -
C++ 访问控制与继承
C++的三大特性之一——封装:隐藏对象的属性和实现细节,仅对外公开接口和对象进行交互,将数据和操作数据的方法进行有机结合。主要通过访问限定符:public/private/protected实现。三种访问权限public限定符被public限定符所修饰的成员变量和函数可以被类的函数、子类的函数和对象、友元函数,也可以由类的对象来访问,即可以使用成员运算符(.或->)来访问。这里的友元函数,可以是该类的友元函数,也可以是该类的友元类的成员函数。private限定符被private限定符修饰的成原创 2020-10-04 23:19:20 · 193 阅读 · 0 评论 -
C++STL sort源码分析
STL的sort算法:当区间长度小于阈值(通常为5~20,STL取16)时,直接采用插入排序,因为插入排序的常系数比较小,数据量小时有不错的效果。当区间长度大于阈值时,采用内省式排序(IntroSort),其行为在大部分情况下几乎与三数取中quick sort完全相同。直到下面两种情况停止:当递归深度过深(递归深度>2*log2(len) ),意味着分割行为有恶化为二次行为的倾向时,能够自我侦测,转而改用Heap Sort,使效率维持在O(nlogn)。当区间长度小于阈值时,停止排序退出in原创 2020-08-13 20:22:10 · 1304 阅读 · 0 评论 -
C++迭代器适配器:反向迭代器、插入迭代器、iostream迭代器
适配器是标准库中的一个通用概念。容器、迭代器和函数都有适配器(C++11出现了lambda函数、function类模板、bind函数,几乎取代了函数适配器)。本质上,适配器是一种机制,能使某种事物的行为看起来像另外一种一样。栈、队列、优先队列都属于容器适配器。本文主要介绍迭代器适配器。迭代器适配器主要有三类:逆向迭代器,插入迭代器,流类迭代器。插入迭代器插入迭代器有三种类型,差异在于元素插入的位置:back_inserter( Container& c ),在容器尾部插入,只能对有push原创 2020-08-13 19:32:14 · 393 阅读 · 0 评论 -
unordered_map 自定义哈希
unordered_map定义template<class Key, class Ty, class Hash = std::hash<Key>, class Pred = std::equal_to<Key>, class Alloc = std::allocator<std::pair<const Key, Ty> > > class unordered_map; > class unor转载 2020-08-04 09:26:11 · 7022 阅读 · 0 评论 -
C++右值引用,左值(lvalue)、将亡值(xvalue)、纯右值(prvalue)
右值引用C++11增加了移动特性(把资源所有权交出给新对象),基于两个原因:在很多时候,对象拷贝后就立即被销毁了,此时移动而非拷贝对象会大幅度提升性能。一些类(比如IO类、unique_ptr)包含不能被共享的资源(IO缓冲、指针),所以这些类型的对象不能被拷贝,但可以被移动。因此引出新的引用类型——右值引用:必须绑定到右值的引用。我们通过 &&来获得右值引用。右值引用有一个重要性质——只能绑定到一个将要摧毁的对象。因此可以自由地将一个右值引用资源移动到另一个对象。右值、左值原创 2020-07-30 16:56:15 · 3030 阅读 · 0 评论 -
C/C++杂记
1.拷贝构造函数为什么需要传引用?如果用传值代替传引用,传值本身就用到了拷贝,直接陷入递归死循环。2.string类原理basic_string是一个模版类,string是模版形参为char的basci_string模版类的类型定义,即typedeftypedef basic_string<char, char_traits<char>, allocator<char>> string;而npos,是初始化为-1表示没有找到:static const siz原创 2020-07-29 21:29:40 · 390 阅读 · 0 评论 -
《深度探索C++对象模型》笔记
第一章1.多态:不同对象去完成同一行为时,可以展现出不同的形态。在运行时,可以通过指向基类的指针或引用,来调用实现派生类中的方法。作用:在面向对象的程序设计中,使用多态能够增强程序的可扩充性,即类型需要修改或增加功能时,只需改动或增加较少的代码,提高开发效率。2.C++对象模型所有的非静态数据成员存储在对象本身中。所有的静态数据成员、成员函数(包括静态与非静态)都置于对象之外。另外,用一张虚函数表(virtual table)存储所有指向虚函数的指针,并在表头附加上一个该类的type_info对象,原创 2020-07-28 19:46:13 · 442 阅读 · 0 评论 -
C++内联函数
来由使用内联函数代替宏,因为宏容易出错。使用场景1.类内定义的成员函数自动内联,类外不内联,所以比较长的成员函数最好定义在类外。但并不绝对,一个好的编译器将会根据函数的定义体,自动地取消不值得的内联。2.比较简短的函数加上内联可以节约函数调用时间,有不至于太浪费空间。限制内联仅是对编译器的一个建议,编译器不会被强制内联。好的编译器将会内联小的、简单的函数,同时忽略复杂的内联,将其当做普通函数。两种编译器不能内联的情况:1.内联函数太复杂,比如递归、循环。任何循环都会被认为太复杂而放弃内联,因原创 2020-07-22 19:25:50 · 165 阅读 · 0 评论 -
c++优先级队列priority_queue compare成员参数分析
c++手册priority_queue <int,vector<int>,less<int> >q;默认使用容器vector,使用less进行比较,默认为大顶堆。Q:默认less比较,应该是升序,为什么是大顶堆?A:因为priority_queue首先输出尾部元素,“先来”的元素实际上最后输出。即队列头含有按照 比较(Compare)所施加弱序的“最后...原创 2020-04-06 11:04:22 · 1856 阅读 · 3 评论