Loading...
2024-12-13 1.7k 字 6 分钟
C++ keyword
C++ 里有很多关键字,初学时很容易被这些关键字绕的云里雾里。现在打算梳理一下 C++ 里比较常见的关键字。 extern 提起extern关键字,就不得不提到 C++ 的编译过程。编译过程大致分为如下几步 预处理 预处理阶段编译器会对#号开头的语句进行替换,比方说代码文件里有一行代码这么写, #define SIZE 100 那么编译器会把文件里出现的 SIZE 统一替换成 100 , 除此之外,像宏函数,引入的头文件,都会做替换。这里有一点需要注意的, #include 一个 C++ 程序必须有的引入头文件,这行代码的执行同样发生在预处理阶段,编译器会把引入的头文件整个复制到代码文件2024-12-10 2.1k 字 9 分钟
C++ reference
在函数调用中,永远逃不开参数传递这个问题。对于一个C++程序,参数传递有着很大的优化空间。 参数传递方式 值传递 1234void func(int x, float y, double *z){ // ...} func函数的参数都属于值传递的方式,书本上又细分成指针传递和值传递,但这其实都是一回事。func函数的传递方式很常见,参数可以是左值也可以是右值。不管是左值还是右值,调用函数的时候都会构造一个临时变量,然后将参数值传递给这个临时变量。 函数参数x,y保存的是值,无论如何修改这两个变量的值,都不影响传递的参数。 参数z是指针,如果函数修改参数z,是不会对2024-11-20 805 字 2 分钟
C++ IO
前言 C的IO库对我来说是一个谜一样存在,它经过了很多层的封装,让程序员调用方式变得简单快捷,但也让程序员无法轻易看透IO库的运行方式。在编写mkDB的时候,要用到文件读写,于是打算加深对C的IO库的认知。 简介 IO库也就是Input/Output即输入/输出库,C++在设计输入输出的时候采用了流式思想。所谓流式思想,就是把输入和输出看成一个整体,也就是把输入和输出的内容都保存到一个长串里,然后对这个长串作其他处理。抽象的概念很难让人产生直观的印象,所以建议通过实践去体会理论的精妙处。 组成部分 基础类 基础类只有一个,命名为ios_base。ios_base是所有I/O流类的基类,2024-10-30 1.6k 字 6 分钟
Connect to MySql
在写一个数据库之前,借鉴mysql是很有必要的。所以写下这篇blog记录折腾MySql的过程。 Ubuntu 22.04 LTS 系统环境 8.0.39-0ubuntu0.22.04.1 (Ubuntu) MySql版本 进入命令行 首先使用下列命令进入mysql命令行 1mysql -uroot -p; 检查状态 然后使用下列命令检查mysql运行状态 1sudo systemctl status mysql 若为绿色说明运行成功 否则mysql出错 原始文件 先进入最原始的数据文件夹,看下没有创建数据库的时候 mysql数据文件是什么样子 输入下列命令进入 1cd /var/li2024-10-30 4.2k 字 14 分钟
File System in mkDB
文件系统是数据库相当重要的一部分,因此文件系统的设计也是非常关键的一步。 磁盘如此浩大,如何才能找到注定的那个地址呢?下面记录了我对文件系统认知的深入过程。 内存 考虑到内存大小限制,无法一次性将磁盘全部信息载入内存,故内存只保留根节点,需要信息时再根据索引定位寻找 索引主要是B+树。 结构概述 页只需要通过双向链表相关联即可,不要求在物理结构上相连。 每个数据页中的记录会按照主键值从小到大的顺序组成一个单向链表,每个数据页都会为存储在它里边的记录生成一个页目录。 通过主键查找某条记录时可以在页目录中使用二分法快速定位到对应的槽,然后再遍历该槽对应分组中的记录即可。 外存 前面了解到S2024-10-30 102 字 1 分钟
Introduction of mkDB
mkDB是基于Linux系统开发的小型数据库,提供简易的C++接口,接口与SQL语句类似,后期考虑加上语法分析器。 mkDB支持多线程并发增删查改。 主要组件有基于B+树实现的存储引擎,支持网络链接的数据管理器,日志打印,数据恢复与备份。 系统功能 数据类型 int char2024-10-29 1.1k 字 3 分钟
Log in mkDB
要保障数据库的数据安全,及时排查错误是很有必要的。这要求数据库拥有一个在复杂环境下安全输出的日志库。因为日志库可以独立于数据库,且数据库开发过程会经常调用日志库,所以数据库的编写工作可以从日志库开始。 需求分析 无论开发什么功能,在编码之前,必须先理清核心需求,也就是分析后面会在什么样的场景下使用日志库,对日志库有什么样的要求,分析清楚后再设计框架。 需求一:打印日志 最核心的功能。打印的格式要有日志等级、日期、具体时间、出错原因,最少要有这几点才能是一个合格的日志,如果能加上出错的代码位置那就最好不过了。 需求二:线程安全 可能同时有多个线程写日志,因此数据库需要考虑如何在多线程条件下2024-10-28 1k 字 3 分钟
Structure of mkDB
结构目录:include | test | docs | | | | _ _ _ | btree | page | table | log | index | database | | _ _ _ | general | page | table | log | index | database | | _ _ _ | btree | comparer |2024-10-28 1.8k 字 6 分钟
Index in mkDb
数据索引采用的数据结构是B+树,B+树是B树的改进版本。为了在实现的时候思路更加清晰,所以先写下一篇blog记录我对索引以及B+树的认知和认知的变化情况。 索引 索引是帮助数据库高效获取数据的排好序的数据结构,这里只需要了解到索引能实现查找数据即可,具体的编码方式会在文件系统介绍里仔细说明。 组成 一个完整的索引数据包含两部分:排序的值和对应的数据。在通常情况下,索引会按照索引字段进行排序并存储,存储引擎会根据编码类型和排序规则进行排序。 索引的数据具体保持的什么需要视情况而定,存储引擎的不同以及索引类型的不同都会导致索引数据存储的方式和结果不同 分类 聚族索引 索引的数据区就是存储这2024-10-17 815 字 3 分钟
C++ use external python libs
前言 使用Qt开发dnd游戏时需要用到大模型,所以需要C++与python(3.8)联动(nodejs也可以,只是本人这次使用的是python)。在联动过程中遇到一些问题,故写下记录。 操作过程 首先解决环境问题,可以选择调用系统环境变量里的python,也可以把python打包进项目里。使用环境变量应该不会出现下面提到的问题,可以直接跳转代码部分,只要保证用户拥有python环境,如果担心用户没有安装python,那就把python环境集成进项目里。 打包python环境 首先先从python官网下载安装包,并根据提示安装。然后新建一个文件夹存储python环境,再进入python的安