C++-非平凡构造函数 C++ 非平凡构造函数 什么是非平凡(non-trival)构造函数? 简单来说,“平凡”意味着这些特殊的成员函数用很朴素的方式完成它们的工作。而”很朴素的方式“这个说法对不同的函数有不同的意义。 对默认构造函数和析构函数来说,“平凡”意味着什么也不做。 对拷贝构造函数和拷贝赋值函数来说,“平凡”意味着只做简单的内存拷贝。 下面是具体的规则: 规则一:如果你为类显式定义了一个构造函数,那么它就 2023-07-17 C++ #C++
muduo库-Buffer实现 muduo库-Buffer实现 muduo库中的Buffer结构示意图如下图所示: 它使用 vector 来作为底层容器,可以进行动态的扩容操作。其次,前置的预留字节空间可用于填充数据序列化后的消息长度。该类的构造函数及其成员变量如下: 123456789101112131415161718192021class Buffer : public muduo::copyable {pub 2023-07-15 C++ > muduo #C++ #muduo
C++-手动实现堆 C++ 手动实现堆 在C++ STL中其实是有堆的实现的,C++ 中的priority_queue就是由堆实现的,但是在面试中堆排序还是非常常问的,所以还是非常有必要手动实现一下堆。 堆的定义 堆是一种特殊的完全二叉树,其满足以下两个条件: 堆中任意节点的值总是不大于(或不小于)其子节点的值。 堆总是一棵完全二叉树。 其中节点值不小于其子节点的堆称为大跟堆,节点值不大于其子节点的堆称为小跟堆。 2023-07-12 C++ > 数据结构与算法 #数据结构与算法 #leetcode #C++
C++11-enable_shared_from_this类 C++11-enable_shared_from_this类 c++11 中的 shared_from_this() 来源于 boost 中的 enable_shared_form_this 类和 shared_from_this() 函数,功能为返回一个当前类的 std::share_ptr,使用方法如下: 12345678#include<memory>class Test: pu 2023-07-11 C++ #C++
muduo库-TCP连接 muduo库-TCP连接 TCP连接中,两端是对等的,TCP协议也没有区分客户端(client)与服务器端(server),但互联网中通信中,往往有一端提供资源给另一端访问,我们把拥有资源的一端称为服务器端,请求资源的一端称为客户端。 对于server,会启用一个监听循环,不断接受client连接请求(三次握手),进行数据通信,通信完成以后断开连接(四次挥手);对于client,在server启 2023-07-10 C++ > muduo #C++ #muduo
muduo库-Socket muduo库-Socket Socket类 Socket类是socket 文件描述符(sock fd)的一个轻量级封装,提供操作底层sock fd的常用方法。采用RTII方式管理sock fd,但本身并不创建sock fd,也不打开它,只负责关闭。 提供的public方法主要包括:获取tcp协议栈信息(tcp_info);绑定ip地址(bind);监听套接字(listen);接收连接请求(acce 2023-07-06 C++ > muduo #C++ #muduo
muduo-事件驱动EventLoop muduo-事件驱动EventLoop 之前说过,muduo网络库处理事件是Reactor模式,one loop per thread,一个线程一个事件循环。这个循环称为EventLoop,这种以事件为驱动的编程模式,称为事件驱动模式。 这种事件驱动模型要求所有任务是非阻塞的,其典型特点是: 如果一个任务需要很长时间才能完成,或者中间可能导致阻塞,就需要对任务进行分段,将其设置为非阻塞的,每次监听 2023-07-03 C++ > muduo #C++ #muduo
muduo库-TimerQueue定时器队列 muduo库-TimerQueue定时器队列 网络编程中,有一类非常重要的事件,跟IO事件没有直接联系,而是内部产生的事件,即定时事件。 muduo网络库中的定时功能是如何实现的呢? 传统的Reactor通过控制select和poll的等待时间,来实现定时,而Linux中,可以用timerfd来实现。前面讲过,timerfd是Linux特有的定时器,能有效融入select/poll/epoll框架 2023-07-02 C++ > muduo #C++ #muduo
muduo库-事件通道Channel muduo库-事件通道Channel 之前说过,Poller的存在是为了监听事件,那么具体监听什么事件呢? 这就需要用到Channel类,它是muduo库负责注册读写事件的类,并保存了fd读写事件发生时调用的回调函数,如果poll/epoll有读写事件发生则将这些事件添加到对应的通道中。一个通道对应唯一EventLoop,一个EventLoop可以有多个通道。 一个通道对应唯一EventLoop, 2023-07-02 C++ > muduo #C++ #muduo
muduo库-I/O复用 muduo库-I/O复用 I/O复用使得程序能同时监听多个文件描述符,能有效提高程序性能。Linux下,实现I/O复用的系统调用主要有3个: select poll epoll muduo采用了2和3,分别用PollPoller/EPollPoller对poll/epoll进行了封装,基类Poller主要用于提供统一的接口。 Poller类 先来看看基类Poller定义: 1234567891 2023-07-02 C++ > muduo #C++ #muduo