- 博客(20)
- 收藏
- 关注
原创 epoll多路复用
目录1. epoll的接口使用1.1 创建1.2 监听队列1.3 就绪队列2. epoll的底层实现3. epoll VS select3.1 select的缺点3.2 epoll的优点4. epoll对文件描述符操作的两种模式4.1 概念4.2 为什么ET模式又称为高效模式?4.3 ET模式下需要注意什么?4.4 两种实现方式1. epoll的接口使用1.1 创建//创建int epoll_create(int size);//size
2021-12-01 19:05:59
424
原创 OOP特性之多态
1. 什么是多态?对于同一种指令,针对不同的对象产生不同的行为 分为静态多态和动态多态:静态多态发生在编译时 --- 函数重载、运算符重载、模板;动态多态发生在运行时 --- 虚函数2. 虚函数2.1 虚函数的定义成员函数名前 + virtual关键字在派生类中重写虚函数:函数名、参数个数、类型、顺序、返回类型必须和基类中一致2.2 虚函数的实现: 基类定义虚函数时,会在基类存储布局顶部生成一个虚函数指针指向虚函数表。派生类继承虚函数时同样...
2021-11-15 14:10:26
799
原创 类---继承
1. 基类和派生类c++中的继承:从既有类(基类)产生新类(派生类)1.1 派生类的生成步骤吸收基类的成员 改造基类的成员 新增自己的成员1.2 派生类的局限数据成员可以完全吸收,但成员函数不能 不能被继承:构造、析构函数、基类重载的operator=/new/delete函数、友元关系1.3 派生方式派生方式 基类中访问权限 派生类访问权限 派生类对象访问权限 public public public 可以直接访问 protecte
2021-11-14 20:51:01
468
原创 特殊的成员
1. 特殊的数据成员1.1 常量数据成员 只能在构造函数初始化列表中进行初始化,不可赋值 --- 可视为普通常量。1.2引用数据成员 只能在构造函数初始化列表中进行初始化,占用一个指针大小的空间(用于区分)。1.3类成员对象一个类创建的对象作为另一个类的数据成员(子对象)。 此时会调用子对象的默认构造函数。 必须在另一类的初始化列表中显式初始化子对象。 1.4静态数据成员 存储在全局静态区,不占用对象的大小,被所有对象共享。不能在初...
2021-11-06 09:26:51
72
原创 类对象的创建和销毁
析构函数1. 特征 ① 函数名 = ~ + 类名;② 无参,无返回类型,故不可重载,函数唯一。2. 被调用时机无论何时一个对象被销毁,就会自动调用其析构函数。变量在离开其作用域时被销毁。 当一个对象被销毁时,其成员被销毁。 容器(无论是标准库容器还是数组)被销毁时,其元素被销毁。 对于动态分配的对象,当对指向他的指针应用delete时被销毁。 对于临时对象,当创建它的完整表达式结束时被销毁。3. 注意由于析构函数自动运行,程序可以按需分配资源而无需担心何时释...
2021-11-03 23:36:15
1229
原创 const关键字
1. const修饰一般变量const关键字修饰的变量成为常量。常量需要初始化,且不可赋值。宏定义和const常量的区别 宏定义发生在预处理阶段,只进行简单的字符串替换,不占用内存空间,不进行检查,发生错误时在编译阶段才会发现。 const常量发生在编译阶段,常量具有数据类型,占用内存空间,便于编译器进行检查。2. const修饰指针常量指针(pointer to const)const int *p; //const 修饰 *p*p = v...
2021-11-01 20:55:45
75
原创 Mysql数据库的备份与恢复
1. 数据库的备份musqldump -u root -p 需要备份的数据库 > 备份的结果2. 数据传输sudo apt install lrzszsz:从linux发送数据到windowsrz:sz的反操作3. 数据库的恢复:① 先创建需要恢复的数据库库名② sudo mysql -u root -p 需要恢复的数据库 < 恢复文件4. 常用命令# 登录Mysql$ mysql -u root -p;#查看MySQL的状态$ s.
2021-10-16 16:18:21
81
原创 数据库编程基本流程(query)
函数查询地址MySQL :: MySQL 8.0 C API Developer Guide :: 5.4 C API Basic Function Descriptionshttps://dev.mysql.com/doc/c-api/8.0/en/c-api-function-descriptions.html1. 初始化数据库SQL* mysql_init(MYSQL *mysql);// An initialized MYSQL* handler. // NULL i.
2021-10-16 16:05:59
437
原创 SQL数据库
目录1. 数据库相关概念1.1 什么是数据库1.2 分类1.3 数据库服务器、数据库和标的关系1.4 基本操作2. SQL语言2.1 DDL2.2 DML2.3 DQL3. 数据完整性3.1 分类3.2 表的约束4. 多表设计4.1 多个表的关系4.2 对表的操作4.3 DQL4.1 连接查询4.2 联合查询4.3 报表查询1. 数据库相关概念1.1 什么是数据库 ① 数据库是一个实体,是能合理保管数据的“...
2021-10-15 23:00:57
346
原创 Linux线程基础
1. 线程的基本概念1.1 进程和线程进 程 线 程 资源分配的基本单位 CPU调度的基本单位 有独立的数据段、代码段和栈空间等独立资源 几乎没有独立资源,只有少量栈空间 上下文切换时间长 上下文切换时间短 进程控制表TLB 线程控制表TCB 一个进程至少拥有一个main线程,可以拥有多个线程,多个线程共享进程的资源和地址空间。 线程执行开销小,占用CPU少,切换快,但不利于资源的管理和保护。 进程则相反。 1.2..
2021-10-01 16:12:49
252
原创 软中断1 --- 信号
1. 信号的特点信号是消息的载体信号是一种软中断2. 信号的默认行为term --- 终止一个进程ign --- 忽略core --- 终止进程,产生core文件stop --- 停止一个进程con --- 继续运行3. 信号的处理默认处理:以默认方式处理。忽略:进程继续运行,忽略对信号的处理。捕捉信号并处理:进程实现定义信号处理函数,接收到信号时由函数自动捕捉并处理。4. signal//信号处理函数typedef void (*sighan
2021-09-29 23:38:30
331
原创 System V IPC --- 消息队列
目录1. 消息队列的特点2. 创建消息队列3. 向消息队列发送数据4. 从消息队列取出数据5. 两种特殊情况1. 消息队列的特点消息队列是一种进程间通信的手段,只适用于在本地的多进程进行通信。 消息队列维持一个消息的链表,使用先进先出的方式 消息队列是有边界的,并不是一次性读取全部数据2. 创建消息队列int msgget(key_t key, int msgflg);3. 向消息队列发送数据int msgsnd(int msqid, const void
2021-09-29 20:04:23
115
原创 Sysytem V IPC --- 信号量
1. 信号量1.1 基本概念① 原子操作 --- 不可被分割的操作② 信号量 --- os为了实现进程同步而引入的一种机制,由荷兰科学家Dijstra提出③ 信号量的值 --- 当前可用资源的数量④ 信号量分类:SYSTEM V 、POSIX、POSIX基于内存⑤ 二进制信号量 --- 只有两种值的信号量,也叫二元信号量,能够实现互斥⑥ 计数信号量 --- 信号值大于1⑦ 实现信号量对资源的控制操作 --- PV操作...
2021-09-28 16:51:21
85
原创 System V IPC --- 共享内存
目录1. 共享内存特性2.创建3. 使用4. 操作5. 私有共享内存共享内存 --- 一块可以被多个进程共享的内存空间1. 共享内存特性① 共享内存一旦创建成功就会一直存在,不会随着进程的结束而消失,直到主动删除或系统重启;2.创建 ①shmget定义int shmget(key_t key, size_t size, int shmflg);//成功则返回共享内存的标识符//key -- 生成共享内存需要的键值//size -- 共享内存大小//s..
2021-09-27 21:49:31
210
原创 进程间通信---管道
1. 无名管道1.1 创建int pipe(int fildes[2]);1.2 特性① 有固定的数据流向 --- fd[1] 写端,fd[0] 读端,通信方式为半双工;② 只能在有亲缘关系的进程之间进行通信;③ 无名管道是内核维护的缓冲区,生存周期有限;④ 基于字节流通信,数据没有边界,可以多次写入,一次全部读取;⑤ 管道的写端关闭,read时不会阻塞,返回值为0;⑥ 管道的读端关闭,write时写管道会受到系统发送的13号信号SIGPIPE终止进程2. 无名管
2021-09-27 14:21:32
207
原创 静态库和动态库
1. 库文件将一些函数代码写好,编译成二进制指令。专门提供给其他文件使用2.静态库VS动态库2.1 静态库直接打包进产品。如果在编译某个程序时链接静态库,则链接器将会搜索静态库并直接拷贝到该程序的可执行二进制文件到当前文件中。2.2 动态库(共享库)产品使用过程中动态加载。在程序编译时并不会被链接到目标代码中,只是把库文件的路径告知可执行程序,在程序运行时才被载入。2.3 静态库和动态库的区别 大小 安装难度 更新难度 动态库 小
2021-09-19 19:53:43
49
原创 红黑树总结
目录1. 红黑树的基本特征2. 红黑树的插入3. 红黑树的删除1. 红黑树的基本特征① 结点必须是红色或黑色;② 根节点必须为黑;③ 空叶子为黑;④ 红色结点的孩子必然是黑(即从根结点出发到空叶子的任意路径上不存在连续的红色结点);⑤ 从根出发到所有空叶子的所有简单路径上黑色结点数必须相等。2. 红黑树的插入情况一:插入位置为根结点---直接插入;情况二:插入位置不是根结点,且双亲节点为黑---直接插入;情况三:插入位置不是根结点,且双亲结点为红,叔叔结点为红-
2021-09-12 20:35:49
77
原创 两个查找算法
1.二分查找(折半查找)T(n) = O(nlogn)void binarySearch(int arr[], int left, int right, int searchNum) { int mid; while (left <= right) { mid = (left + right) / 2; if (arr[mid]== searchNum) { printf("%d is in the array.\n", searchNum); return; }
2021-09-12 20:16:41
64
原创 八个排序算法
目录1.冒泡排序2.选择排序3.插入排序4.希尔排序5.快速排序6.堆排序7.归并排序8.计数排序1.冒泡排序思路:从N,N-1,···,2个数中找到最大值,放在当前数组的末尾。优化版:当一趟比较中没有发生任何交换时,说明数组已经有序。void bubbleSort(int arr[]) { int cnt = 0; for (int i = N; i > 0; --i) { for (int j = 0; j < i -
2021-09-12 19:39:09
358
原创 二叉树的基本操作
目录1.层次建立二叉树1.1 结点已知1.2 结点未知2.先序遍历3.中序遍历4.后序遍历1.层次建立二叉树1.1 结点已知借助一个索引数组。① 申请空间;② 双指针法:i指向要修改指针域的结点;j指向要被放入的结点。void buildTree(pTreeNode_t arr[], char c[]) { for (int i = 0; i < N; ++i) { arr[i] = (pTreeNode_t)calloc(1, size
2021-09-12 13:58:25
96
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人