c++服务器开发学习--02--MySQL,Redis,ASIO,iocp,TrinityCore代码结构,c++对象模型
c++服务器开发学习--02--MySQL,Redis,ASIO,iocp,TrinityCore代码结构,c++对象模型
- MySQL
- 问题
- Redis
- Asio
- iocp
- TrinityCore代码结构
- c++对象模型
- 虚函数表(vtbl)、虚指针(vptr)
- 对象模型
- 非继承
- 单继承
- 多继承
- 虚继承
MySQL
学习链接:MySQL教程|菜鸟教程,博主学的是基础部分。
数据库操作:创建(CREATE),删除(DROP)
数据表操作:
创建:CREATE
删除:DROP
插入:INSERT INTO
查询:SELECT FROM…… WHERE……
更新:UPDATE……SET……
删除数据表中的某些数据:DELETE FROM
获取指定记录:LIKE
排序:ORDER BY (ASC:升序;DESC:降序)
分组:GROUP BY
连接SELECT语句结果:UNION,UNION ALL(取重复值)
多张数据表中取数据:
问题
UNION 和 INNER JOIN在用处上有什么区别?
Redis
学习链接:Redis教程|菜鸟教程,博主学的是基础部分。
Redis:Remote Dictionary Server
- 数据类型:
- String: 字符串
- Hash: 散列
- List: 列表
- Set: 集合
- Sorted Set: 有序集合
- 命令,键:
- 命令:redis-cli,
连接到本地的redis服务;
连接到某个特定的redis服务;
- 键命令的基本语法:
String命令
Hash命令
是一个string类型的field(字段)和value的(值)映射表,存储键值对;一个hash最多存储232−12^{32}-1232−1个键值对。
- List命令
按插入顺序排序,一个List最多存储232−12^{32}-1232−1个元素。
- Set命令
String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
集合中最大的成员数为 232−12^{32} - 1232−1(4294967295, 每个集合可存储40多亿个成员)。
- Sorted Set命令
有序集合和集合一样也是 string 类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个 double 类型的分数。redis 正是通过分数来为集合中的成员进行从小到大的排序。
有序集合的成员是唯一的,但分数(score)却可以重复。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。 集合中最大的成员数为 232−12^{32} - 1232−1 (4294967295, 每个集合可存储40多亿个成员)。
Asio
学习链接:c++网络编程之asio
- ASIO 与c++标准库:
c++20标准库的网络部分主要基于ASIO,ASIO主要只有socket和socket编程需要的定时器功能会进标准(标准也是循序渐进,第一个版本就只有这点,http之类的,可能会在后续版本加入),ASIO本身包含的文件、串口、unix域套接字等都会删掉。进入C++20的功能大概只占ASIO的25%。
iocp
学习链接:完成端口教程
TrinityCore代码结构
https://github.com/TrinityCore/TrinityCore
c++对象模型
学习链接:图说C++对象模型
对象模型研究的是对象在存储上的空间与时间上的更优,并对C++面向对象技术加以支持,如以虚指针、虚表机制支持多态特性。
虚函数表(vtbl)、虚指针(vptr)
虚函数表:当一个类在实现的时候,如果存在一个或以上的虚函数时,那么这个类便会包含一张虚函数表。而当一个子类继承并重载了基类的虚函数时,它也会有自己的一张虚函数表。
虚函数调用与虚指针:
对于虚函数的调用是通过查虚函数表来进行的,每个虚函数在虚函数表中都存放着自己的一个地址,而如何在虚函数表中进行查找,则是通过虚指针来调用,在内存结构中它一般都会放在类最开始的地方。
虚表指针(vptr)的位置为编译器决定,传统上它被放在所有显示声明的成员之后,不过现在许多编译器把vptr放在一个类对象的最前端。
- 虚函数与普通函数的调用关系:
只要某一个类X包含虚函数,无论是它的父类或者它本身拥有,那么这个类的对象都会包含一个虚指针vptr,至于vptr要指向哪张表,取决于类X它本身是否含有虚函数。
对象模型
非继承
构造函数-析构函数-虚函数-nonstatic数据成员-static数据成员
通过 (int*)(&p)取得虚函数表的地址;
type_info信息的确存在于虚表的前一个位置。通过((int)(int*)(&p) - 1))取得type_infn信息,并成功获得类的名称的Base;
虚函数表的第一个函数是析构函数;
虚函数表的第二个函数是虚函数print(),取得地址后通过地址调用它(而非通过对象),验证正确;
虚表指针的下一个位置为nonstatic数据成员baseI;
可以看到,static成员函数的地址段位与虚表指针、baseI的地址段位不同。
单继承
在C++对象模型中,对于一般继承(这个一般是相对于虚拟继承而言),若子类重写(overwrite)了父类的虚函数,则子类虚函数将覆盖虚表中对应的父类虚函数(注意子类与父类拥有各自的一个虚函数表);若子类并无overwrite父类虚函数,而是声明了自己新的虚函数,则该虚函数地址将扩充到虚函数表最后。
而对于虚继承,若子类overwrite父类虚函数,同样地将覆盖父类子物体中的虚函数表对应位置,而若子类声明了自己新的虚函数,则编译器将为子类增加一个新的虚表指针vptr。
多继承
多个父类一个子类
- 在多继承中,子类含有多个父类的子对象,子类的虚函数被放在声明的第一个基类的虚函数表中。
- 当子类overwrite了父类的函数,所有基类的print()函数都被子类的print()函数覆盖。
- 内存布局中,父类按照其声明顺序排列。
一个父类被重复继承 (菱形继承)
虚继承
虚继承的子类,如果本身定义了新的虚函数,**则编译器为其生成一个虚函数指针(vptr)以及一张虚函数表。**该vptr位于对象内存最前面。
vs非虚继承:直接扩展父类虚函数表。
虚继承的子类也单独保留了父类的vptr与虚函数表。这部分内容接与子类内容以一个四字节的0来分界。
虚继承的子类对象中,含有四字节的虚表指针偏移值。
c++服务器开发学习--02--MySQL,Redis,ASIO,iocp,TrinityCore代码结构,c++对象模型相关推荐
- c++服务器开发学习--03--TrinityCore学习
c++服务器开发学习--03--TrinityCore学习 下载安装配置一些软件, MySQL Unity Everything
- Redis运维和开发学习笔记(2) redis持久化
Redis运维和开发学习笔记(2) redis持久化 文章目录 Redis运维和开发学习笔记(2) redis持久化 持久化 持久化方式一:RDB 触发~~的三种~~方式 1. save命令 2. b ...
- c++服务器开发学习--01--c++基础,socket
c++服务器开发学习--01--c++基础,socket c++基础 问题 记录内容 socket c++基础 学习链接:w3cschool,博客中只记录了博主感到疑问和重要的内容. 问题 byte类 ...
- Redis运维和开发学习笔记(4) Redis参数意义
Redis运维和开发学习笔记(4) Redis参数意义 文章目录 Redis运维和开发学习笔记(4) Redis参数意义 参数意义 参数意义 Client连接 问题 id=567800790 addr ...
- Redis运维和开发学习笔记(3)redis搭建集群
Redis运维和开发学习笔记(3)redis搭建集群 文章目录 Redis运维和开发学习笔记(3)redis搭建集群 Redis集群搭建 Redis集群搭建 cp /etc/redis.d/redis ...
- 旅游系统(SSM框架+MySQL+Redis+VUE)后端代码
旅游系统(SSM框架+MySQL+Redis+VUE)后端代码 文章目录 旅游系统(SSM框架+MySQL+Redis+VUE)后端代码 Controller 登录 注册 路线 邮件 退出 头部信息 ...
- 这可能是东半球最保姆级的后台服务器开发学习路线
作者 | 编程指北 来源 | 编程指北(id :cs_dev) 前言 这一篇的主题是「Linux C/C++ 服务器/后台开发学习路线」. 这样的文章相信大家都见得不少了,写之前也非常忐忑,能不能和其 ...
- 万字长文 | 这可能是东半球最保姆级的后台服务器开发学习路线
前言 这一篇的主题是「Linux C/C++ 服务器/后台开发学习路线」. 这篇文章会有点长有点干,可以先去冲杯咖啡,慢慢看~ 正文 | 干货 |收藏 一.后端/后台/服务器开发? 经常在各大公司招聘 ...
- 后台服务器开发学习指南(建议收藏)
前言 这一篇的主题是「Linux C/C++ 服务器/后台开发学习路线」. 这样的文章相信大家都见得不少了,写之前也非常忐忑,能不能和其它人写得不一样, 也定下了一个目标,这篇文章,不能是简单的堆砌学 ...
最新文章
- 如何在ToolBar中显示文字和图标,自定义图标大小,并和MenuItem关联
- 如何从失焦的图像中恢复景深并将图像变清晰?
- pynlpir(ICTCLAS)初步使用
- mysql如果数据不存在,则插入新数据,否则更新
- win10时间和linux不同步时间,ubuntu16和windows10的时间同步问题
- JavaScript中使用Json
- 程序员需要学习太多数学知识吗?
- CountDownLatch/CyclicBarrie用法记录
- c++ protected_java基础之——访问修饰符(private/default/protected/public)
- 8.2 复用(protected+向上转型+final关键字+类的初始化)
- spark 稀疏矩阵存储详细解读
- 基于微信小程序的学习网站源码
- ffmpeg推流到流媒体服务器
- C语言面试部分知识点整理总结
- 移动端element日期插件不弹软键盘
- android fps性能分析,Android性能专项FPS测试实践(二)
- (copy即运行)嗖嗖移动大厅详讲!!!一看便知
- 你不能错过的超赞色彩组合
- Python爬虫:博客被抄袭了还不知道?快来查查
- alter命令的使用
热门文章
- jQuery-事件委托(基本概述+实例)
- php判断base64编码,检测PHP中的base64编码?
- VS2019 配色_NBA球员上脚:基德穿AJ13湖人配色,莫兰特的保罗乔治4代!
- 数据中心空调系统一种变风量节能控制策略
- 展望数据中心市场未来十年发展趋势
- Ubuntu之bashrc:成功解决Ubuntu系统内出现的conda:未找到命令
- 成功解决Module Not Found Error : No module named mglearn
- 成功解决AttributeError: module 'tensorflow' has no attribute 'merge_all_summaries'
- 成功解决VMware虚拟机中的please remove the installation medium then press enter
- springboot 单元测试