C/C++
文章平均质量分 51
swings_ss
C++后台、计算机视觉
展开
-
RPC框架源码阅读笔记
前言为了掌握 rpc 框架的基本原理,阅读了一个简单的 rpc 框架的源码(co) 。消息协议使用 json 。coco 这份代码是一个 C++ 基础库,开源在 github 上两个多月,获得了 1.3k star,说明这份代码的质量还是比较高的,有一定的学习价值。co 包含了一个基于 json 的 rpc 框架,相关实现在 base/rpc.h 和 base/rpc.cc,另外,还有一...原创 2020-01-20 21:03:25 · 444 阅读 · 0 评论 -
libevent核心原理
Libevent 是一个轻量级的高性能网络库,事件驱动,基于 Reactor 模式。对 Libevent 源码的阅读可围绕事件管理展开:Libevent 对三类事件源进行了统一,用 event 结构体表示,每个 event 实例表示一个事件。同时监听多个事件(比如监听多个 socket 上的可读事件),必然会有多个 event 实例,对这些 event 实例进行管理需要特定的数据结构,Li...原创 2019-07-12 17:47:12 · 1917 阅读 · 0 评论 -
libevent中的尾队列
一、前言在 libevent 源码中,包括 注册事件队列(eventqueue) 和 激活事件队列(activequeues) 在内的很多地方都用到了 尾队列 这种数据结构。而 尾队列 的实现有点复杂,因此写一篇博客分析一下~二、相关结构体2.1 Entry结构体libevent 中尾队列的 Entry(即尾队列元素) 结构体定义如下:#define TAILQ_ENTRY(type) ...原创 2019-06-11 22:10:53 · 611 阅读 · 1 评论 -
收集的C++后台实习生面试题
目录腾讯三次握手和四次挥手过程,握手为什么不是两次TCP和UDP的区别UDP能不能实现可靠连接流量控制进程和线程的区别进程间通信方式守护进程堆和栈的区别STL有没有用过,vector怎么实现map怎么实现红黑树有什么特性常见排序算法有哪些,时间复杂度快排的思路讲一下给大量qq号(亿为单位)排序数组里搜索第k大的数非递归二分查找链表相加select、poll...原创 2019-04-29 16:28:19 · 756 阅读 · 0 评论 -
C++实现LRU算法
LRU算法LRU是Least Recently Used的缩写,即最近最少使用,常用于页面置换算法,是为虚拟页式存储管理服务的。LRU算法的提出,是基于这样一个事实:已经很久没有使用的页面很可能在未来较长的一段时间内不会被用到。因此,我们只需要在每次调换时,找到最近最久未使用的那个页面调出内存。这就是LRU算法的全部内容。实现使用双向链表和哈希表实现LRU算法双向链表用于保存key-va...原创 2019-04-09 23:29:21 · 5062 阅读 · 4 评论 -
std::list中size的时间复杂度
最近在做一个性能要求较高的项目,有个服务器需要处理每秒2万个udp包,每个包内有40个元素(当然这是高峰期)。服务器需要一个链表,算法中有个逻辑要把每个元素添加到链表末尾(只是这个元素对象的指针,不存在对象复制的问题),再从链表中把这些元素取出(另一个时间点)。就是一个单线程在做这件事。既然逻辑这么简单,我自然选用了C++的标准STL容器List(Linux GNU,sgi的实现...转载 2019-04-09 21:53:08 · 1418 阅读 · 1 评论 -
云风协程库代码分析
一、什么是协程协程,英文叫做 Coroutine,又称微线程、纤程,协程是一种用户态的轻量级线程。简单地说,协程就是在用户态对线程的模拟,我们都知道线程的调度是由操作系统内核完成的,而协程的调度是由用户代码完成的。相比线程,协程有如下优势协程切换在用户态完成,不需要进入内核态,没有线程切换的开销,效率更高多个协程是在同一个线程中运行的,不存在多线程环境下的写变量冲突,因此不需要多线程的锁...原创 2019-03-13 17:36:40 · 507 阅读 · 0 评论 -
C++11实现单例模式
1 线程不安全的单例模式类的静态成员变量由所有对象共享,也就是在内存中只有一份,我们可以利用这个特性凭直觉写出如下的单例模式class Singleton {public: static Singleton* getInstance(); Singleton(const Singleton& rhs) = delete; Singleton& operator=(con...原创 2019-03-07 23:17:13 · 1774 阅读 · 5 评论 -
C++中不可声明为虚函数的5种函数
1. 普通函数(非类成员函数)多态依托于类实现,因此普通函数不可被声明为虚函数2. 构造函数虚表指针在构造函数中初始化,而虚函数保存在虚表中,调用虚函数时需要通过虚表指针找到虚函数若构造函数是虚函数,则调用构造函数需要先得到虚表指针,而虚表指针又需要在构造函数中初始化,矛盾3. 静态函数虚函数保存在虚表中,调用虚函数时需要通过this指针得到虚表指针,再通过虚表指针找到虚函数...原创 2019-02-26 23:48:10 · 518 阅读 · 0 评论 -
epoll的ET模式为什么一定要使用非阻塞IO
ET模式下每次write或read需要循环write或read直到返回EAGAIN错误。以读操作为例,这是因为ET模式只在socket描述符状态发生变化时才触发事件,如果不一次把socket内核缓冲区的数据读完,会导致socket内核缓冲区中即使还有一部分数据,该socket的可读事件也不会被触发根据上面的讨论,若ET模式下使用阻塞IO,则程序一定会阻塞在最后一次write或read操作,因此...原创 2019-02-26 23:35:39 · 3154 阅读 · 0 评论 -
拷贝构造函数的形参为什么要const引用
如果拷贝构造函数的参数使用值传递,那么从实参到形参会有一个复制的过程,这个复制过程会导致拷贝构造函数的再次被调用,从而无限地递归调用下去使用const的原因是防止在拷贝构造函数内部对引用形参进行修改...原创 2019-03-05 19:45:52 · 981 阅读 · 0 评论 -
C++11实现的高性能静态web服务器
这是个人的C++网络编程项目,在开始做这个项目之前,花时间读了一些C++后台方向的书,包括《C++Primer》《深度探索C++对象模型》《Effective C++》《STL源码剖析》《UNIX环境高级编程》《TCP/IP网络编程》《Linux系统编程》《Linux高性能服务器编程》《Linux多线程服务器编程》纸上得来终觉浅,读了这些书后觉得知识点很杂很破碎,于是想要做...原创 2019-02-21 21:30:08 · 5269 阅读 · 2 评论 -
C++智能指针循环引用问题分析
C++11中引入了三种智能指针,分别是shared_ptr、weak_ptr和unique_ptr智能指针的作用智能指针可以帮助我们管理动态分配的堆内存,减少内存泄漏的可能性手动管理堆内存有引起内存泄漏的可能,比如这段代码try { int* p = new int; // Do something delete p;} catch(...) { // C...原创 2018-09-20 16:27:37 · 12892 阅读 · 7 评论 -
g++编译报错undefined reference to `boost::system::generic_category()'的解决方法
最近在学习基于boost库C++网络编程,在ubuntu下用sudo apt-get install libboost-dev安装了boost库后,用g++编译程序时报错undefined reference to `boost::system::generic_category()'于是上网搜索解决方法,在编译选项中加上了-lboost_system然而还没完,又出现了新...原创 2018-06-21 02:48:37 · 4066 阅读 · 1 评论