c++服务器开发学习--02--MySQL,Redis,ASIO,iocp,TrinityCore代码结构,c++对象模型

  • MySQL
    • 问题
  • Redis
  • Asio
  • iocp
  • TrinityCore代码结构
  • c++对象模型
    • 虚函数表(vtbl)、虚指针(vptr)
    • 对象模型
      • 非继承
      • 单继承
      • 多继承
      • 虚继承

MySQL

学习链接:MySQL教程|菜鸟教程,博主学的是基础部分。

  1. 数据库操作:创建(CREATE),删除(DROP)

  2. 数据表操作:

  • 创建: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

  1. 数据类型:
  • String: 字符串
  • Hash: 散列
  • List: 列表
  • Set: 集合
  • Sorted Set: 有序集合
  1. 命令,键:
  • 命令:redis-cli

连接到本地的redis服务;

连接到某个特定的redis服务;

  • 键命令的基本语法:
  1. String命令

  2. Hash命令

是一个string类型的field(字段)和value的(值)映射表,存储键值对;一个hash最多存储232−12^{32}-1232−1个键值对。

  1. List命令

按插入顺序排序,一个List最多存储232−12^{32}-1232−1个元素。

  1. Set命令

String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。

Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。

集合中最大的成员数为 232−12^{32} - 1232−1(4294967295, 每个集合可存储40多亿个成员)。

  1. Sorted Set命令

有序集合和集合一样也是 string 类型元素的集合,且不允许重复的成员。

不同的是每个元素都会关联一个 double 类型的分数。redis 正是通过分数来为集合中的成员进行从小到大的排序。

有序集合的成员是唯一的,但分数(score)却可以重复。

集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。 集合中最大的成员数为 232−12^{32} - 1232−1 (4294967295, 每个集合可存储40多亿个成员)。

Asio

学习链接:c++网络编程之asio

  1. 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++对象模型相关推荐

  1. c++服务器开发学习--03--TrinityCore学习

    c++服务器开发学习--03--TrinityCore学习 下载安装配置一些软件, MySQL Unity Everything

  2. Redis运维和开发学习笔记(2) redis持久化

    Redis运维和开发学习笔记(2) redis持久化 文章目录 Redis运维和开发学习笔记(2) redis持久化 持久化 持久化方式一:RDB 触发~~的三种~~方式 1. save命令 2. b ...

  3. c++服务器开发学习--01--c++基础,socket

    c++服务器开发学习--01--c++基础,socket c++基础 问题 记录内容 socket c++基础 学习链接:w3cschool,博客中只记录了博主感到疑问和重要的内容. 问题 byte类 ...

  4. Redis运维和开发学习笔记(4) Redis参数意义

    Redis运维和开发学习笔记(4) Redis参数意义 文章目录 Redis运维和开发学习笔记(4) Redis参数意义 参数意义 参数意义 Client连接 问题 id=567800790 addr ...

  5. Redis运维和开发学习笔记(3)redis搭建集群

    Redis运维和开发学习笔记(3)redis搭建集群 文章目录 Redis运维和开发学习笔记(3)redis搭建集群 Redis集群搭建 Redis集群搭建 cp /etc/redis.d/redis ...

  6. 旅游系统(SSM框架+MySQL+Redis+VUE)后端代码

    旅游系统(SSM框架+MySQL+Redis+VUE)后端代码 文章目录 旅游系统(SSM框架+MySQL+Redis+VUE)后端代码 Controller 登录 注册 路线 邮件 退出 头部信息 ...

  7. 这可能是东半球最保姆级的后台服务器开发学习路线

    作者 | 编程指北 来源 | 编程指北(id :cs_dev) 前言 这一篇的主题是「Linux C/C++ 服务器/后台开发学习路线」. 这样的文章相信大家都见得不少了,写之前也非常忐忑,能不能和其 ...

  8. 万字长文 | 这可能是东半球最保姆级的后台服务器开发学习路线

    前言 这一篇的主题是「Linux C/C++ 服务器/后台开发学习路线」. 这篇文章会有点长有点干,可以先去冲杯咖啡,慢慢看~ 正文 | 干货 |收藏 一.后端/后台/服务器开发? 经常在各大公司招聘 ...

  9. 后台服务器开发学习指南(建议收藏)

    前言 这一篇的主题是「Linux C/C++ 服务器/后台开发学习路线」. 这样的文章相信大家都见得不少了,写之前也非常忐忑,能不能和其它人写得不一样, 也定下了一个目标,这篇文章,不能是简单的堆砌学 ...

最新文章

  1. 如何在ToolBar中显示文字和图标,自定义图标大小,并和MenuItem关联
  2. 如何从失焦的图像中恢复景深并将图像变清晰?
  3. pynlpir(ICTCLAS)初步使用
  4. mysql如果数据不存在,则插入新数据,否则更新
  5. win10时间和linux不同步时间,ubuntu16和windows10的时间同步问题
  6. JavaScript中使用Json
  7. 程序员需要学习太多数学知识吗?
  8. CountDownLatch/CyclicBarrie用法记录
  9. c++ protected_java基础之——访问修饰符(private/default/protected/public)
  10. 8.2 复用(protected+向上转型+final关键字+类的初始化)
  11. spark 稀疏矩阵存储详细解读
  12. 基于微信小程序的学习网站源码
  13. ffmpeg推流到流媒体服务器
  14. C语言面试部分知识点整理总结
  15. 移动端element日期插件不弹软键盘
  16. android fps性能分析,Android性能专项FPS测试实践(二)
  17. (copy即运行)嗖嗖移动大厅详讲!!!一看便知
  18. 你不能错过的超赞色彩组合
  19. Python爬虫:博客被抄袭了还不知道?快来查查
  20. alter命令的使用

热门文章

  1. jQuery-事件委托(基本概述+实例)
  2. php判断base64编码,检测PHP中的base64编码?
  3. VS2019 配色_NBA球员上脚:基德穿AJ13湖人配色,莫兰特的保罗乔治4代!
  4. 数据中心空调系统一种变风量节能控制策略
  5. 展望数据中心市场未来十年发展趋势
  6. Ubuntu之bashrc:成功解决Ubuntu系统内出现的conda:未找到命令
  7. 成功解决Module Not Found Error : No module named mglearn
  8. 成功解决AttributeError: module 'tensorflow' has no attribute 'merge_all_summaries'
  9. 成功解决VMware虚拟机中的please remove the installation medium then press enter
  10. springboot 单元测试