c++
文章平均质量分 50
却道天凉_好个秋
这个作者很懒,什么都没留下…
展开
-
leveldb源码剖析(二)——LSM Tree
LSM Tree具有较高的写入性能,主要通过写入内存和磁盘顺序写实现;写入数据时,先将数据写入内存,当内存达到一定大小时,将内存中的数据一次性顺序写入(flush)磁盘,生成SSTable中一个segment,segment内部数据也是有序的;读取数据时,先查找布隆过滤器,如查询不到直接返回key不存在,如存在,继续查询稀疏索引表;查找稀疏索引表,根据查询到的范围从磁盘读取数据,进而利用二分法读取获取最终结果;原创 2024-09-04 22:37:41 · 1190 阅读 · 0 评论 -
leveldb源码解析(一)——编解码
leveldb中,数字的存储统一采用,通过对数字编码和压缩,节省了存储空间。原创 2024-09-03 21:27:07 · 233 阅读 · 0 评论 -
c++ 自旋锁、读写锁和可打断锁
【代码】c++ 自旋锁、读写锁和可打断锁。原创 2024-03-31 11:13:29 · 278 阅读 · 0 评论 -
c++ LRU(最近最少使用)缓存机制
【代码】c++ LRU(最近最少使用)缓存机制。原创 2023-11-22 21:22:11 · 168 阅读 · 0 评论 -
c++ 获取当前时间(精确至秒、毫秒和微妙)
表示时间的持续时间(Duration)原创 2023-11-20 22:32:33 · 6638 阅读 · 0 评论 -
c++ 线程安全的string类
c++标准未规定stl容器以及字符串的线程安全性,故std::string在多线程下是不安全的。原创 2023-10-29 09:04:32 · 731 阅读 · 0 评论 -
c++ tinyXml介绍
TinyXML是一个开源的解析XML的解析库。解析库的模型通过解析XML文件,在内存中生成DOM模型,使得可以方便的遍历XML。原创 2023-09-17 18:45:39 · 335 阅读 · 0 评论 -
c++——“LNK2001 无法解析的外部符号 _printf”问题解决方案
使用Visual Studio2019建立工程,依赖Visual Studio2015编译好的库(高版本的编译器依赖低版本编译的库)。原创 2023-08-31 22:52:59 · 1560 阅读 · 0 评论 -
c++ 使用sort排序
【代码】c++ 使用sort排序。原创 2023-08-14 21:37:20 · 115 阅读 · 0 评论 -
c++ 递归锁的使用
同一个线程里,在锁未释放的情况下反复加锁,会导致死锁。发现程序卡住不动,无Func函数中的打印。原创 2023-08-09 21:15:03 · 686 阅读 · 0 评论 -
c++ udp组播总结
多播,也称为“组播”,将网络中同一业务类型主机进行了逻辑上的分组,进行数据收发的时候其数据仅仅在同一分组中进行,其他的主机没有加入此分组不能收发对应的数据。原创 2023-08-02 21:56:32 · 1585 阅读 · 0 评论 -
c++ inotify+epoll实现异步文件监控
动态监测linux系统某一个目录下文件的变化。具体使用场景如linux下应用程序运行时产生日志文件,尤其在程序出现某种异常时,日志文件记录着错误出现的原因、时间及代码位置等信息,此时日志文件在增长,但是采用轮询的方式定时查看日志文件尤为消耗性能。基于此问题,采用**“epoll+inotify异步文件监控”**的方式可以实现日志的动态刷新。原创 2023-07-31 21:19:47 · 1019 阅读 · 0 评论 -
c++ for循环中使用auto关键字
【代码】c++ for循环中使用auto关键字。原创 2023-07-31 21:18:36 · 587 阅读 · 0 评论 -
c++内存映射文件
4)在接收进程中打开对应的内存映射对象。1G的文件完成文件映射需要143微妙。3)映射文件到进程的虚拟地址空间。2)创建内存映射内核对象。5)回写内存映射文件。原创 2023-07-15 18:52:26 · 2837 阅读 · 0 评论 -
c++ swap函数的优势
关于std::move可以参考:https://blog.csdn.net/www_dong/article/details/110411032。开发过程中,特定业务下使用该方式不失为一种提升程序性能的手段,尤其是map中存储的信息数据量较大时,可以做到良好的数据交换。1)std::map::swap函数的内存分配器必须是可分配的;2)如自定义内存分配器不满足分配器要求,会引发assert异常;通过结果可以看出,swap的方式是毫秒级别的。,这样做可以减少内存拷贝,与性能关系密切;原创 2023-04-08 21:27:20 · 506 阅读 · 1 评论 -
c++加解密算法总结
数据发信方将明文(原始数据)和加密密钥一起经过特殊加密算法处理后,使其变成复杂的加密密文发送出去。收信方收到密文后,若想解读原文,则需要使用加密用过的密钥及相同算法的逆算法对密文进行解密,才能使其恢复成可读明文。在对称加密算法中,使用的密钥只有一个,发收信双方都使用这个密钥对数据进行加密和解密,这就要求解密方事先必须知道加密密钥。非对称加密算法需要两个密钥来进行加密和解密,分别是公钥和私钥。公钥和私钥成对存在,如果用公钥对数据进行加密,那么只有使用对应的私钥才能解密。原创 2023-03-25 21:00:47 · 2786 阅读 · 0 评论 -
c++删除字符串中所有换行和空格
【代码】c++删除字符串中所有换行和空格。原创 2023-03-21 21:09:50 · 1401 阅读 · 0 评论 -
c++续行符的使用
续行符的使用;#if 、#ifndef 和 #ifdef的介绍原创 2023-02-26 20:13:44 · 828 阅读 · 0 评论 -
windows下编译leveldb(动态库+静态库)
windows下编译leveldb原创 2023-02-25 11:40:55 · 1686 阅读 · 0 评论 -
c++时间函数总结
c++时间函数总结原创 2023-01-04 20:20:58 · 2729 阅读 · 0 评论 -
c++——一个萃取的实例
萃取的简单介绍原创 2022-12-10 13:07:42 · 226 阅读 · 0 评论 -
c++——动态库加载函数的总结
动态库加载函数的总结。原创 2022-10-29 11:05:57 · 1925 阅读 · 0 评论 -
c++——windows下动态库的显式调用和隐式调用
动态库的显式调用和隐式调用原创 2022-09-27 21:55:48 · 1219 阅读 · 0 评论 -
c++——线程安全的单例
线程安全,c++11之后支持。原创 2022-08-11 22:42:05 · 660 阅读 · 1 评论 -
c++——iocp模型
IOCP有一个队列,当你要发数据时,收数据和连接时,都交由IOCP队列处理,不会与操作系统底层交互。 该函数实际用于两个明显有别的目的:5.4.3 向IOCP队列投递接受连接的请求5.4.4 检测队列,从队列中取出完成的请求5.4.5 投递一个队列完成状态6. 示例服务端客户端...转载 2022-07-07 22:05:41 · 5021 阅读 · 3 评论 -
c++——inline
1. 作用在C++中,为了解决一些频繁调用的小函数大量消耗栈内存问题,特别的引入了inline修饰符,表示为内联函数。栈空间是指防止程序局部数据的内存空间。在系统下,栈空间是有限的,如果频繁大量的使用就会造成因栈空间不足而导致程序出错的问题。在程序编译时,编译器将程序中出现的内联函数调用表达式用内联函数的函数体进行替代,类似于宏展开。如:int min ( int v1, int v2){ return (v1< v2 ? v1: v2);}//代码编写时,是直接按照函数名转载 2022-05-22 23:00:34 · 401 阅读 · 2 评论 -
c++——dynamic_cast的使用
1)dynamic_cast要求操作数必须是多态类型(即要求父类要存在virtual虚函数);class Base{public: Base() { } ~Base() { } void test() { cout << "Base" << endl; }};class Derived : public Base{public: Derived() { }原创 2022-05-19 22:34:32 · 1669 阅读 · 0 评论 -
c++——ifndef的作用
目的防止头文件的重复包含和编译。说明// test_rtsp.h#ifndef __TEST_RTSP__#define __TEST_RTSP__//中间内容省略#endif作用在程序编译阶段,如果有两个文件同时include了test_rtsp.h, 文件1在编译时会判断__TEST_RTSP__有没有被定义,如果没有,则定义之。当文件2编译时发现__TEST_RTSP__已经被定义,则跳出文件,这样做避免了重复编译文件。...原创 2022-05-18 23:00:31 · 304 阅读 · 0 评论 -
c++对象模型04——Data Member的布局
1. 数据成员的布局规则我们以一个类声明为例,介绍数据的布局规则class Point3d{public: /*...*/private: float x; static List<Point3d*> *freeList; float y; static const int chunkSize = 20; float z;};程序解析每一个Point3d对象由3个float组成,在内存中排列的次序是x,y,z 静态(static)数据不属于某个特定的对象,转载 2021-11-30 21:45:40 · 109 阅读 · 0 评论 -
c++对象模型03——C++对象内存大小模型
引入下面的Point3d是一个类,我们有一个问题:影响x的存取效率的因素有哪些?Point3d origin;origin.x = 0.0;下面我们有分别定义了类对象的变量形式与指针形式,那么通过origin和pt对数据成员存取有什么差异吗?Point3d origin,*pt = &origin;origin.x = 0.0;pt->x = 0.0;1. 静态数据成员(Static Data Members)1.1 特点静态数据成员并不属于某一特定类对象,.转载 2021-11-15 23:28:43 · 180 阅读 · 0 评论 -
c++对象模型02——C++对象内存大小模型
C++对象的内存大小由以下几个方面决定:空类的大小默认为1 类中非静态成员的总和 如果有继承,派生类的对象会加上基类对象的数据成员 如果有virtual,那么就需要加上一个虚函数表指针的大小(在继承方式下,父子类共享一个虚函数表,因此子类的虚函数表指针是继承于父类的,不会新增一个虚函数表指针) 内存对齐补齐规则1. 无继承下的对象内存模型案例:class ZooAnimal {public: ZooAnimal()=default; virtual ~ZooAnimal() {转载 2021-11-13 23:35:49 · 247 阅读 · 0 评论 -
c++对象模型01——C++ Object Model
1. c++成员种类在C++中,有两种类型的数据成员: 静态成员、非静态成员 在C++中,有三种类型的成员函数: 静态函数、非静态函数、虚函数 class Point {public: Point(float xval); virtual ~Point(); float x()const; static int PointCount();protected: virtual ostream& print(ostream &os)const; floa转载 2021-11-12 23:53:45 · 302 阅读 · 0 评论 -
c++——std::swap的实现
std::swap的源码实现如下:template<typename T>void swap(T &a,T &b) noexcept{ T temp = std::move(a); a = std::move(b); b = std::move(temp);}std::swap是基于std::move语义实现的,关于std::move的介绍可以参考:c++11总结03——右值引用_www_dong的博客-CSDN博客...原创 2021-11-04 10:09:09 · 3044 阅读 · 0 评论 -
c++——函数指针
1. 格式指针名前*号,并且将*和指针名用括号括起来//指针名为pf,指向一个返回值为bool,参数为两个const string&的函数bool (*pf)(const string&, const string&); //这个不是函数指针,而是一个返回值为bool*的pf函数bool *pf(const string&, const string&);2. 函数指针赋值可以直接将函数名赋值给函数指针,或者在函数名前加&符号都可以转载 2021-08-29 23:18:14 · 1038 阅读 · 0 评论 -
c++——类模板
1. 概念类模板:一个模板(是模板) 模板类:调用类模板生成的类对象(是类实体),也称为类模板的实例化类模板的定义:template <typename T>class Blob{public: Blob(); Blob(std::initializer_list<T> i);};类模板的使用:在定义类时,使用到类名的地方都需要显示的给出模板类的类型,格式为<>int main(){ Blob<int&g转载 2021-08-29 22:02:15 · 3504 阅读 · 0 评论 -
c++——函数模板
1. 定义template<typename T>以关键字template开头,后面跟一个模板参数列表,列表里面用逗号将多个模板参数隔开定义的注意事项。模板的编译当编译器遇到一个模板定义时,并不生成代码。只有当实例化处模板的一个特定版本时,编译器才会生成代码 重点:通常,当我们调用一个函数/定义实例化一个类时,编译器只需掌握函数的声明/类的声明即可,因此可以把函数/类的声明放置在头文件,而把函数/类的定义放置在源文件中。但是模板则不同:为了实例化模板函数,编译器必须掌握函数转载 2021-08-29 21:08:53 · 268 阅读 · 0 评论 -
c++——抽象类的纯虚析构函数
一个示例:class Parent{public: Parent() {} virtual ~Parent() = 0; };class Child : public Parent{ //具体实现};int main(){ { Parent* p = new Child(); } system("pause"); return 0;}编译时会报如下错误:LNK2019 无法解析的外部符号 "public: virtual __thiscall原创 2021-08-03 22:17:01 · 622 阅读 · 1 评论 -
c++——svn常用命令
1. svn checkout pathpath 是服务器上的目录。svn checkout path例如:svn checkout svn://192.168.1.1/pro/domain简写:svn co2.svn checkout path subv这样将把你的工作拷贝放到subv而不是和前面那样放到trunk。3.svn add filefile是某个文件或者某个目录,如果添加所有的文件则用点“.”表示。svn add file例如:svn add tes..转载 2021-07-19 22:10:22 · 681 阅读 · 0 评论 -
c++——pimpl技法
1. 概念pimpl(Private Implementation 或 Pointer to Implementation)是通过一个私有的成员指针,将指针所指向的类的内部实现数据进行隐藏。2. 优点1)降低模块的耦合;2)降低编译依赖,提高编译速度;3)接口与实现分离,提高接口的稳定性;3. 实现原则1. 暴露的接口里面不要有虚函数,要显式声明构造函数、析构函数,并且不能inline。sizeof(Graphics) == sizeeof(Graphics::Impl*)原创 2021-07-12 20:42:02 · 490 阅读 · 0 评论 -
c++——Unicode、UTF-8、UTF-16
计算机起源于美国,上个世纪,他们对英语字符与二进制位之间的关系做了统一规定,并制定了一套字符编码规则,这套编码规则被称为ASCII编码ASCII 编码一共定义了128个字符的编码规则,用七位二进制表示 ( 0x00 - 0x7F ), 这些字符组成的集合就叫做 ASCII 字符集随着计算机的普及,在不同的地区和国家又出现了很多字符编码,比如: 大陆的 GB2312、港台的 BIG5, 日本的 Shift JIS等等由于字符编码不同,计算机在不同国家之间的交流变得很困难,经常会出现乱码的问题,比如原创 2021-06-09 21:49:55 · 2228 阅读 · 1 评论