- 博客(97)
- 收藏
- 关注
原创 murmur 算法
MurmurHash是一种高效的非加密哈希函数,适用于哈希表中的一般哈希任务。MurmurHash的名称来源于Murmur,意为一种低频的声音,体现了其设计的低碰撞率和高性能。名称来自两个基本操作,乘法(MU)和旋转(R),在其内部循环中使用。与其它流行的哈希函数相比,对于规律性较强的key,MurmurHash的随机分布特征表现更良好。MurmurHash与加密散列函数不同,它不是专门设计为难以被对手逆转,因此不适用于加密目的。
2024-09-21 19:57:36
692
原创 c++的智能指针中 unique_ptr 为什么比 shared_ptr 多一个模板参数?
【代码】c++的智能指针中 unique_ptr 为什么比 shared_ptr 多一个模板参数?
2024-02-21 19:18:32
474
原创 模板妙用 ----- Wrapper
该结构体包含两个模板类型参数,Class 表示类的类型,EventFunc 表示类的成员函数指针类型,包含两个成员变量 p 和 f,用来存储类的指针和成员函数指针,operator() 实现了对成员函数的调用。该结构体包含两个模板类型参数,Class 表示类的类型,AlgorithmFunc 表示类的成员函数指针类型,包含两个成员变量 p 和 f,用来存储类的指针和成员函数指针,Run 实现了对成员函数的调用。在示例代码中,定义了一个基类 Algorithm,包含一个纯虚函数 Run,表示算法的执行函数。
2023-07-21 14:52:21
148
原创 GC书籍笔记
垃圾回收的目的是回收程序不在使用的对象所占用的空间。任何自动内存管理系统都面临三个任务:为新对象分配空间确定存活对象回收死亡对象所占用的空间。
2023-07-14 17:41:44
528
原创 Compare-and-Swap 和 Read-Modify-Write
原子的read-modify-write操作——简称RMW——要比原子的load/store更复杂。RMW允许读一块共享数据的同时还原地修改它的值。以fetch_add为例,它首先读取一个共享变量的当前值,对这个值做加法,再将新的值写回去——这3步是原子完成的。你可以用锁来完成同样的操作,但这就不是无锁的了。而RMW操作则天生就被设计为是无锁的。RMW操作可以受益于任何CPU的无锁指令,如ARMv7的ldrex/strex。
2023-07-13 20:22:29
626
原创 CRTP 与 mixin
C++中有一种很特别的模式,称为Curiously Recurring Template Pattern,缩写是CRTP。从它的名字看,前三个词都是关键字。Curiously,意思是奇特的。Recurring,说明它是递归的。Template,说明它与模板有关。最常见的CRTP形式就很符合这三个关键字:确实挺奇特的:派生类继承自一个用派生类特化的基类,相当于自己特化了自己。这里面应用到了C++模板的一个特性:与模板参数有关的代码的编译会推迟到模板实例化时进行。最经典常见的是 enable_shared_f
2023-07-12 19:42:44
329
原创 mixin 思想与实践
一个独立的类(如Person)与一个mixin的区别在于,一个mixin只建模小的功能点(如printing或displaying),不是用来独立使用的,而是给其它需要这个功能的类做组合的。成一个新的类,像乐高一样,满足需求。如果你新增了基础类,只要它是和其它基础类正交的,就可以扩展到这个组合类里。可以用继承来做,每个概念变成一个接口,然后具体类去实现这些接口。mixin要解的问题:如何建模一系列正交概念。,它就是用来与其它类或mixin做组合的。mixin是给一组基础类,每个都建模了一个。
2023-07-12 17:40:48
179
原创 自旋锁 spinlock
自旋锁和互斥锁都是用于保护共享资源的锁,但它们的实现方式和特点有所不同:实现方式:互斥锁采用的是阻塞等待的方式,即当一个线程请求锁时,如果锁已经被其它线程占用了,那么该线程将被阻塞等待,直到该锁被释放。而自旋锁则采用循环等待的方式,即当一个线程请求自旋锁时,如果锁已经被其它线程占用,则该线程会循环等待,直到轮到它获取锁为止。线程调度机制:互斥锁阻塞等待时,会把线程从运行队列中移除,等待解锁时再加入运行队列。而自旋锁循环等待时,线程不会被移除运行队列,而是等待占用锁的线程释放锁。
2023-06-16 19:29:06
487
原创 libgo 流程分析(1)
libgo主要的功能模块主要包括:调度器( Scheduler )、处理器( Processer )、协程( Task )和一个FastSteadyClock。其中 Scheduler -> Processer -> Task 三层逻辑结构实现了对协程( Task )的生命周期管理和调度和运行。scheduler 功能Processer的功能。
2023-04-27 17:17:37
583
原创 gdb如何打印stl各种容器
[root@lcl]# cat ~/.gdbinit## STL GDB evaluators/views/utilities - 1.03## The new GDB commands:# are entirely non instrumental# do not depend on any "inline"(s) - e.g. size(), [], etc# are extremely tolerant to debugger
2023-04-08 15:09:14
485
原创 内存分配器—TcMalloc
高性能。大多数对象的分配和释放都不需要产生太多的竞争,因为tcmalloc 维护了thread-cache 来提供当前线程的内存分配需求。所以,应用大多数的内存申请需求不会有锁的竞争,而且在多核场景有较好的扩展性。灵活的使用内存资源。用户不使用的内存,tcmalloc会选择服复用或者归还操作系统。降低了每个请求的内存开销。通过分配相同大小的page 降低内存使用的开销,这在小对象场景较为有效。内部信息统计开销较低。能够开启细粒度的应用内存占用信息,来帮助用户展示tcmalloc内部内存使用的细节。
2023-03-18 17:25:35
605
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人