自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(57)
  • 收藏
  • 关注

原创 Redis zset 共享对象

本文介绍 Redis 中 skiplist 编码的 zset 对象是如何共享对象的。skiplist 编码的 zset 对象为了同时支持高效的点查询和范围查询,内部使用了跳表和哈希表。倘若将每个插入的元素都拷贝两份,分别插入跳表和哈希表,将浪费大量的内存,那 Redis 是怎么让二者共享对象的呢?

2024-07-25 19:41:58 972

原创 Go AfterFunc 不触发

Go 的 time.AfterFunc 的作用是等待指定的时间间隔,然后在它自己的 goroutine 中调用 f。现在有一个问题,我明明调用了 AfterFunc,但是它还没调用我指定的函数,程序就退出了。

2024-06-12 10:00:00 428

原创 Redis RDB 持久化问题

有 A、B 两台计算机,将 A 中 Redis 的 rdb 文件拷贝到 B,B 重启 Redis 并未加载拷贝来的 rdb 文件。经过重重排查,最终发现问题出在 Redis 关闭的时候。

2024-05-26 21:55:49 555

原创 enable_shared_from_this 实现原理

enable_shared_from_this 可以帮助我们用 this 指针安全地创建 shared_ptr。

2024-05-15 21:10:57 601

原创 shared_ptr 引用计数相关问题

智能指针是 C++11 增加的非常重要的特性,并且也是面试的高频考点,本文主要解释以下几个问题:- 引用计数是怎么共享的、怎么解决并发问题的- 资源释放时,控制块的内存释放吗- weak_ptr 怎么判断对象是否已经释放

2024-05-11 20:29:43 830

原创 Redis rehash 相关问题

本文主要介绍 Redis Hash 表 rehash 相关的三个问题:- 什么时候触发 rehash- rehash 扩容扩多大- rehash 如何执行

2024-05-03 20:03:51 808

原创 Win 下 ncnn 编译运行

官网上编译的过程比较详细,本文主要记录编译、运行过程中遇到的问题,希望可以帮到大家。我的环境是 Win10 系统,VS 2022。

2024-04-24 16:42:32 859

原创 TIME_WAIT 状态存在的目的

TIME_WAIT 状态有两个存在的理由:1. 可靠地实现 TCP 全双工连接的终止2. 允许老的重复数据在网络中消逝

2024-03-08 09:30:00 389

原创 W-TinyLFU 算法实现

主缓存(main cache)使用 SLRU 逐出策略和 TinyLFU 准入策略(TinyLFU 的准入和淘汰策略是:新增一个元素时,判断使用该元素替换一个旧元素,是否可以提升缓存命中率),而窗口缓存(window cache)采用 LRU 逐出策略而没有任何准入策略。

2024-02-27 13:37:38 1285

原创 LRU Cache

LRU(Least Recently Used,最进最少使用)页面置换算法的思想是:在缺页中断发生时,置换未使用时间最长的页面。该思想依赖局部性原理:在前面几条指令中频繁使用的页面很可能在后面的几条指令中被使用。

2024-02-13 10:00:00 846

原创 Go 语言 for 的用法

本文简单翻译了 Go 语言中 for 的三种用法,可快速学习 Go 语言 for 的使用方法,希望本文能为你解开一些关于 for 的疑惑。

2024-02-07 19:38:35 1579

原创 跳表的实现

跳表是一种有序数据结构,它通过在每个节点中维护多个指向其他节点的指针,从而达到快速访问节点的目的。跳表支持平均 O(logN)、最坏 O(N) 复杂度的节点查找,还可以通过顺序性操作来批量处理节点。

2024-01-31 11:11:33 1013

原创 C++ 实现单例模式

单例模式确保一个类只有一个实例,并提供一个全局访问点。单例模式是一个比较常见的设计模式,但使用 C++ 实现会有一些意想不到的坑,文章最后给出了推荐的实现方式。

2024-01-30 21:11:15 1444 4

原创 shared_ptr 模拟实现

shared_ptr 这种智能指针访问对象采用共享所有权来管理其生存期。没有哪个特定的 shared_ptr 拥有该对象。取而代之的是,所有指涉到它的 shared_ptr 共同协作,确保在不再需要该对象的时刻将其析构。

2023-12-04 08:45:32 476

原创 printf 是怎么舍入的

先说结论,IEEE 754 浮点标准默认采用的是向偶数舍入。

2023-10-09 08:46:58 219 1

原创 Open64 编译器安装

网络上关于 Open64 的资料很少,自己安装也花了很长时间,因此将安装过程整理出来。我使用的是 w2ll 分支,对应的 Tags 为「clang-prebuilt」,系统是 ubuntu 20.04,使用以下方法成功安装的时间是:2023 年 08 月 01 日。

2023-08-14 13:23:11 625 5

原创 静态链接库顺序问题

最近遇到了一个非常奇怪的问题,编译时竟因为链接库的顺序不同,就有完全不同的结果。这些东西都是在 muduo_base 中定义的,我明明链接的 muduo_base 库,为什么会有这些报错呢?当我改变链接库的顺序时,神奇的一幕出现了。编译成功了,运行程序也得到了我想要的结果。这究竟是为什么呢?下面就来为你解答这一迷题。

2023-05-30 10:00:00 903

原创 虚函数经典问题

由此得出了虚表指针的构造时机:在 base class constructors 调用操作之后,但是在程序员供应的代码或是 member initialization ilst 中所列的 members 初始化操作之前。

2023-05-16 08:20:40 345

原创 C 语言隐式类型转换

C 语言隐式执行的类型转换,让我们难以捉摸。有时默默进行的类型转化会导致难忘的经历,我曾经就因 -1 > 1 这个表达式为真,找了一个多小时的 bug。

2023-05-04 10:00:00 562 1

原创 编译器的过度优化

编译器在进行优化的时候,可能为了效率而交换不相关的两条相邻指令的执行顺序。也就是指令重排,这也就引发了一些问题,下面就带大家看两个经典的问题。

2023-04-21 09:26:38 542

原创 虚函数表存储位置

先说结论:虚函数表存储在可执行目标文件的只读数据段、虚函数存储在代码段、虚表指针的存储的位置与对象存储的位置相同。

2023-04-05 10:00:00 5166 3

原创 sort 的 comp 为什么要求严格弱序

在使用 STL 提供的 sort 时,默认提供的排序方式可能不满足我们的需求,sort 也支持用户指定一个彷函数作为排序标准。有时,明明只是多了个等号又为什么错了呢?本文就带你解决这个疑惑。

2023-03-18 10:00:00 859 1

原创 STL sort 分析

STL 的 sort 算法,数据量大时采用快速排序,分段递归。一旦分段的数据量小于某个门槛,为避免快速排序的递归调用带来过大的额外负荷,就改用插入排序。如果递归层次过深,还会改用堆排序。这个算法接受两个随机迭代器,然后将区间内的所有元素以升序排列。

2023-03-15 10:00:00 988

原创 哈希表的实现

二叉搜索树具有对数时间的表现,但这样的表现建立在一个假设上:输入的数据有足够的随机性。哈希表又名散列表,在插入、删除、搜索等操作上具有「常数平均时间」的表现,而且这种表现是以统计为基础,不需依赖输入元素的随机性。

2023-03-10 10:00:00 1589

原创 继承下的缺省参数值和访问说明符

本文将介绍 C++ 继承体系下,函数缺省参数的绑定和函数访问说明符的绑定。这些奇怪的问题实际上不应在我们的代码中出现,但它们能帮助我们理解 C++ 的动态绑定和静态绑定,也能帮助我们更好的通过面试。

2023-03-06 10:00:00 1170

原创 AVL 树实现

也许因为插入的值不够随机,也许因为经过某些插入或删除操作,二叉搜索树可能会失去平衡,甚至可能退化为单链表,造成搜索效率低。AVL Tree 要求任何节点的左右子树高度相差最多为 1。当违反该规定时,就需要进行旋转来保证该规定。

2023-03-03 10:00:00 877 1

原创 二叉搜索树实现

树由节点(nodes)和边(edges)构成,如下图所示。整棵树有一个最上端节点,称为根节点(root)。每个节点可以拥有具有方向的边(directed edges),用来和其他节点相连。相连的节点之中,在上者称为父节点(parent),在下者称为子节点(child)。

2023-02-28 13:34:11 678

原创 SGI 空间配置器

空间配置器是 STL 六大组件之一,它总是隐藏在容器的背后,默默工作,默默付出。本文为《STL 源码剖析》读书笔记,主要讨论 SGI 版本空间的配置和释放,对代码进行解读时会改变一些写法,使其更易于阅读。

2023-02-24 10:00:00 1743

原创 C++ 基础

本文介绍一些 C++ 中基础的入门知识,主要包含函数的缺省参数、函数重载、引用、内敛函数以及 const 的知识。

2023-02-12 14:10:39 725 2

原创 返回值的理解

我们写的函数是怎么返回的,该如何返回一个临时变量,临时变量不是出栈就销毁了吗,为什么可以传递给调用方?返回对象的大小对使用的方式有影响吗?本文将带你探究这些问题。

2023-01-26 09:45:00 1183

原创 传参的理解

当我们调用函数的时候,参数是怎么传递给被调用方的,有想过这个问题吗?传递不同大小的参数对调用方式有影响吗?本文将带你探究这些问题。

2023-01-25 09:45:00 1111 1

原创 浮点数舍入规则

想必大家对小数的舍入很熟悉,毕竟四舍五入是我们在小学就听到的概念。但很遗憾,计算机并没有采用这种舍入方式,因此有时我们会对它的一些进位产生疑惑,本文就为大家解开这个疑惑。

2023-01-24 10:00:00 3668

原创 C 语言目标文件

一个 C 语言程序经编译器和汇编器生成可重定位目标文件,再经链接器生成可执行目标文件。那么目标文件中存放的是什么?我们的源代码在经编译以后又是怎么存储的?

2023-01-16 10:32:00 2182 1

原创 C 语言编译链接

一个 C 程序究竟是怎么变成可执行程序的,这其间发生了什么?实际上,上述过程可以分为 4 个步骤,分别是预处理(Preprocessing)、编译(Compilation)、汇编(Assembly)和链接(Linking)。

2023-01-15 09:29:13 792

原创 C 语言字符串库函数模拟实现

本文介绍 C 语言中一些常用的处理字符串的函数,并给出简易的实现。

2023-01-13 10:56:29 617 1

原创 STL forward_list 模拟实现

forward_list 是 C++ 11 新增的容器,它的实现为单链表。forward_list 是支持从容器中的任何位置快速插入和移除元素的容器,不支持快速随机访问。forward_list 和 list 的主要区别在于,前者的迭代器属于单向的 Forward Iterator,后者的迭代器属于双向的 Bidirectional Iterator。

2023-01-11 16:38:33 920

原创 STL list 模拟实现

相比于 vector 的连续线性空间,list 采用的是零散的空间,它的好处是每次插入或删除一个元素,就配置或释放一个元素空间。list 是支持常数时间从容器任何位置插入和移除元素容器,但不支持快速随机访问。list 通常实现为双向链表,与 forward\_list 相比,list 的迭代器可以向前移动,但也因此需要在节点中多开辟一个指针变量,在空间上效率稍低。

2023-01-10 19:05:12 370

原创 STL vector 模拟实现

vector 的数据结构安排及操作方式,与原生数组十分相似,两者唯一的差别在于空间运用的灵活性。原生数组是静态空间,一旦配置了就不能改变大小;vector 是动态空间,可以在插入过程中动态调整空间大小。vector 的实现技术,关键在于它对大小的控制及重新配置时的数据移动效率。

2023-01-09 15:54:44 669

原创 拓扑排序(Topological Sorting)

简单来说,就是将图中的所有节点展开成一维序列,对于序列中任意的节点(u,v),如果在序列中 u 在 v 的前面,则说明在图中存在从 u 出发达到 v 的通路,即 u 排在 v 的前面。

2022-12-13 11:31:26 778

原创 STL 迭代器萃取

迭代器是一种抽象的设计概念,《Design Patterns》一书中对于 iterator 模式的定义如下:提供一种方法,使之能够依序巡访某个聚合物(容器)所含的各个元素,而又无需暴露该聚合物的内部表述方式。

2022-11-30 12:03:09 1002

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除