![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
c++
一些在学习c++时候的笔记,原来保存到本地了,避免丢失就上传一下
wekidi
这个作者很懒,什么都没留下…
展开
-
C++ | 实现mysql连接池
利用单利模式获取连接池实例,支持高并发,为每个连接记录存活时间,当连接总量大于最大连接数时会将时间过长的连接断开,当池子没有连接时会利用生产者线程进行生产 Connpool *Connpool::instance = nullptr; //获得池子 Connpool *Connpool::GetInstance() { if (instance == nullptr) { std::lock_guard<std::mutex> lock(instance_mute原创 2022-04-24 17:34:23 · 1853 阅读 · 0 评论 -
C++ | function和bind
可调用对象 可调用对象的定义:(满足一个即可) 是一个函数指针 是一个具有operator()成员函数的类对象(就是仿函数) 是一个可被转换为函数指针的类对象 是一个类成员(函数)指针 关于一个可被转换为函数指针的类对象的举例: struct Bar { using fr_t = void(*) (void);//返回值为空参数为空的函数指针类型定义为fr_t static void func(void) { //... } operator fr_t(void) { return f原创 2022-04-17 19:02:14 · 667 阅读 · 0 评论 -
C++并发编程 | 实现通用线程池
此线程池采用了半同步半异步,而且实现了任意任务的传入,不限制参数和返回值,用到了std::packaged_task和future,利用lambda 表达式作为统一调用. SynbQueue为同步队列,在此类中添加要执行的任务 ThreadPoll负责创建线程池并且没有任务时阻塞,当有任务添加时,将其唤醒并执行,大致模型为 第一层为同步服务层,处理来自上层的任务请求,上层的任务请求是并发的,并不会马上处理,而是将这些任务放到一个同步队列中,等待处理。 第二层为同步队列,来自上层的任务都会加到队列中等待处理原创 2022-04-05 17:18:39 · 877 阅读 · 0 评论 -
C++并发 | std::future原理
只是了解future可以异步返回一个函数的返回值,和std::packaged_task一起使用,但是不了解其中原理,上网看了一些资料做个总结^^ std::future 可以用来获取异步任务的结果,因此可以把它当成一种简单的线程间同步的手段. 通过用packaged_task和目标任务和参数打包形成的packaged_task类,我的理解是里面重载了()运算符,使对象成为可调用的仿函数, struct st { int val; void operator()(int x) { val = x;原创 2022-04-05 18:07:37 · 1335 阅读 · 1 评论 -
C++ | 对象池结合单例模式
思想就是一个对象只能有一个池子,用对象从池子里面取,每个池子有一个管理者来管理所对应的池子,取对象从管理者这里申请 template<class _Ty> class ObjectPoll { private: enum { PollSize = 4 }; protected: struct _Node { _Node* next; }; _Node* front; _Node* rear; void ReFull() { int total = sizeof(原创 2022-03-27 14:09:56 · 788 阅读 · 0 评论 -
c++ | 函数调用时栈使用情况分析(汇编)
int main() { int a = 1; int b = 2; int c = sum(a , b); int d = 2; return 0; } sum调用前 此时ebp:012FF98C ,esp:012FF890 将b的值入栈,a的值入栈 执行call。执行call的时候,先把下一条指令的地址入栈,再跳转。 对于每一次push操作,%esp储存的地址会-1 sum栈中: 将ebp的值将入栈,还没入,此时ebp的值为0x012FF98C,esp为0x012FF884.原创 2022-03-12 17:55:02 · 837 阅读 · 0 评论 -
vector | resize和reserve在底层上的差异
今天通过源码大概分析了一遍resize的流程,不是特别详细,只是了解了大致过程 ,简单来说就是 当申请的尺寸大于当前的容量,会进行_Resize_reallocate,流程我大概总结了一下,就是 先按照新容量进行空间的申请返回新的地址_Newvec, 将_Appended_first置为新的地址+旧size*sizeof(class) 在_Appended_first将额外新的对象进行构建,这样_Appended_first之上的几个对象空间用来存储以前就有对象 然后在_Newvec进行拷贝构造,(以前就有原创 2022-02-26 18:42:11 · 181 阅读 · 0 评论 -
C++ | 虚继承和内存结构
虚继承和虚函数是完全无相关的两个概念。 虚继承是解决C++多重继承问题的一种手段,从不同途径继承来的同一基类,会在子类中存在多份拷贝。这将存在两个问题:其一,浪费存储空间;第二,存在二义性问题,通常可以将派生类对象的地址赋值给基类对象,实现的具体方式是,将基类指针指向继承类(继承类有基类的拷贝)中的基类对象的地址,但是多重继承可能存在一个基类的多份拷贝,这就出现了二义性。 虚继承可以解决多种继承前面提到的两个问题: 虚继承底层实现原理与编译器相关,一般通过虚基类指针和虚基类表实现,每个虚继承的子类都有一个虚原创 2022-02-25 21:51:26 · 190 阅读 · 0 评论 -
C++ | 实例化和具体化
实例化是将利用模板产生对象: Pair<string, string> ii; // 隐式 实例化对象 template class Pair<int, double>; //显式实例化对象 具体化是模板的细分,就是更加具体一些,但还是个模板 template<class _Ty, class _Dx = default_Deletor<_Ty>> class my_share_ptr{}; template<class _Ty, cl原创 2022-02-20 22:18:33 · 447 阅读 · 0 评论 -
C++ | 智能指针
RAII 资源的获取即初始化 资源的使用经历三个步骤 获取资源 使用资源 销毁资源 引入智能指针的目的 使用裸指针的缺点: 难以区分是单个对象还是一个数组 使用完无法判断是否应该销毁指针 没有办法分辨一个指针处于悬挂状态 难以保证在所有路径中只有一次的销毁指针操作 智能指针所干的事就是当对象不再需要时就自动执行清理 auto_ptr代码 template<class _Ty> class my_auto_ptr { bool _Owns; _Ty* _Ptr; public: ex原创 2022-02-15 22:55:07 · 261 阅读 · 0 评论 -
C/C++ | 内存模型的比较
今天看到一篇内容,讲的是new和malloc区别,虽然是老生常谈,但是这篇文章给我一个新的认知 我们都知道在C++中,内存分为五个区:堆、栈、自由存储区、全局/静态存储区和常量存储区。 在C中,分为代码区,全局初始化数据区/静态数据区 ...原创 2022-02-15 14:31:55 · 496 阅读 · 0 评论 -
C++ | 用C语言实现多态和一些思考
一些思考原创 2022-02-13 21:30:02 · 354 阅读 · 0 评论 -
C++ | 多态和对虚函数理解和详解
编译时多态,早期绑定(编联) 在编译时期就能确定调用关系,通过函数的重载和运算符的重载来实现的。 运行时多态 运行时的多态性是指在程序执行前,无法根据函数名和参数来确定该调用哪一个函数,必须在程序执行过程中,根据执行的具体情况来动态地确定。它是通过类继承关系public和虚函数来实现的。目的也是建立一种通用的程序。通用性是程序追求的主要目标之一。 虚函数 虚函数是一个类的成员函数,定义格式如下 class Animal { private: char name[20]; public: Animal(c原创 2022-02-12 20:47:26 · 451 阅读 · 0 评论 -
C | 浅析malloc实现
malloc底层实现原理,较浅转载 2022-02-11 18:46:04 · 118 阅读 · 0 评论 -
C++ | 模板相关
清晰概念 类模板和模板类 类模板表示是一个模板,可以用此模板产生其他模板类 模板类是由模板而产生的类 函数模板和模板函数 模板函数重点是模板,表示他是一个模板,用来产生模板函数 模板函数就是用模板刻出来的函数 运行机制 1.编译器会对函数模板进行两次编译 (在声明的地方对模板代码本身进行编译;在调用的地方再对参数替换后的代码进行编译。) 2.编译器在对函数模板编译时与调用的次数无关,与调用时参数类型有关 ...原创 2022-02-11 18:14:24 · 157 阅读 · 0 评论 -
C++ | 继承详解
继承机制 先构建基类对象再构建派生对象,基类对象时派生对象的一个成员, 保护类型可以被继承(无论什么继承方式),但私有类型不能 如果在派生对象中定义一个基类对象,那么这个对象中会有隐藏基类对象和自己定义的基类对象. 在派生类o中定义一个基类对象a,无论a是共有还是私有还是保护,a中的保护和私有类型派生类o均无法访问. 保护属性在外部无法访问,和私有的区别在继承的时候,派生类可以访问保护类型 函数和变量和父类重名时,会优先选择子类,可以通过作用域访问父类同名成员. 友元不具有继承性. //通过作用域访问原创 2022-02-11 17:34:32 · 148 阅读 · 0 评论 -
C++ | const和指针引用的混淆点
const的意思是所修饰的变量不能被修改 const char* s = "woshishabi"; const和指针 const char* s = "woshishabi"; int a = 10; const int b = 20; b = a;//err a = b;//ok int* p = &a; const int* p1 = &a; const int* const p2 = &a; a = 11; *p1 = 12;//err *p2 = 1原创 2022-02-09 21:49:07 · 377 阅读 · 0 评论 -
C++ | 引用
概念 引用可以看作变量的别名,就是给变量起一个"小名",比如张三,我们给他起了一个外号叫贼娃子,我们打贼娃子打的就是张三. 其实底层就是指针. 使用 任何类型的变量都可以引用,但是引用类型却不能引用,在定义int&& p=i;会失败 ,引用一旦被初始化就不能改变指向, int b = 0; int d = 10; int& c = b; c = d;//b改为10 int&& p = b;//err, int&& p = c;//err,原创 2022-02-09 21:07:16 · 275 阅读 · 0 评论 -
C++ | C和C++区别
输入和输出 c++:cin,cout c:printf,scanf 引用 引用可以看作是变量的别名,在引用上的修改可以直接修改到原变量. inline函数(内联函数) 在C++中,为了解决一些频繁调用的小函数大量消耗栈空间(栈内存)的问题,特别的引入了inline 修饰符,表示为内联函数。 内联函数的处理方式是在函数的调用点直接代码展开。在计算机系统下,假如频繁的调用就会造成较大的时间开销。内联函数的引入减少了函数调用过程中开栈和清栈的开销。 函数的重载 模板函数 动态内存上的区别 ..原创 2022-02-09 20:23:09 · 459 阅读 · 0 评论