智能指针 智能指针C++11 引入了 3 个智能指针类型: std::unique_ptr<T> :独占资源所有权的指针。 std::shared_ptr<T> :共享资源所有权的指针。 std::weak_ptr<T> :共享资源的观察者,需要和 std::shared_ptr 一起使用,不影响资源的生命周期。 std::unique_ptr简单说,当我们独占资源的 2024-08-24 C语言编程拾遗 > C++ #C语言编程拾遗 #C++
左值右值 什么是左值和右值左值可以取地址、位于等号左边;而右值没法取地址,位于等号右边。 比如: 12int a = 5;A b = A(); //A是一个类 其中a和b是左值,5和A()是右值。 左值引用和右值引用引用本质是别名,可以通过引用修改变量的值,传参时传引用可以避免拷贝,其实现原理和指针类似。 左值引用能指向左值,不能指向右值的就是左值引用 123int a = 5;int &re 2024-08-24 C语言编程拾遗 > C++ #C语言编程拾遗 #C++
C++面经 C++中的extern关键字extern是c++引入的一个关键字,它可以应用于一个全局变量,函数或模板声明,说明该符号具有外部链接(external linkage)属性。什么是声明?在程序中变量可以声明多次,但只能定义一次。一般而言,定义就是声明。但C++中由于extern的缘故,变量的声明和定义是可以分开的。凡是没有带extern的声明同时也都是定义(对于变量而言)。而对函数而言,带有{}是定 2024-08-24 C语言编程拾遗 > 面试 #C语言编程拾遗 #面试
迭代器设计 为什么要有萃取技术既然迭代器是一种智能指针,iterator也要对一个原生指针进行封装,而问题就来源于此,当我们需要这个原生指针所指向对象的类型的时候(比如声明变量),我们应该怎么办。 Case1:对于函数的局部变量例如,有一个函数template<class T> void func (T iter),其中T是指向某个特定对象的指针,那么如果在func中需要指针指向对象类型的变量应该 2024-08-24 C语言编程拾遗 > STL源码剖析 #C语言编程拾遗 #STL源码剖析
空间配置器 空间配置器SGI STL有2个种空间配置器: std::allocator,符合STL标准,但很少使用,也不建议使用。因为只是把::operator new和::operator delete做了一层薄薄封装,效率差。 std::alloc,SGI特殊空间配置器,将配置器分为两级,兼顾了效率与内存碎片问题,效率高。推荐使用。 下面主要讲的也是std::alloc。 一般而言,我们所习惯的C++ 2024-08-24 C语言编程拾遗 > STL源码剖析 #C语言编程拾遗 #STL源码剖析
序列式容器 序列式容器所谓序列式容器,其中的元素都可序,但未必有序,C++语言本身提供了一个序列式容器array,STL另外再提供vector、list、deque、stack、queue、priority-queue等序列容器。其中stack和queue由于只是将deque改头换面而成,技术上被归类为一种配接器。 vectorvector是动态空间,实现技术,关键在于其对大小的控制以及重新配置时的数据移动效 2024-08-24 C语言编程拾遗 > STL源码剖析 #C语言编程拾遗 #STL源码剖析
关联式容器 关联式容器所谓关联式容器,观念上类似于关联式数据库,每个元素都有一个键值key和一个实值value。当向容器插入元素时,容器根据其key值将实值放到适当的位置。关联式容器没有头尾的概念,所以也不会有push_front(),push_back()等操作函数。 STL关联容器分为set(集合)和map(映射表)两大类,及其衍生体multiset和multimap。这些容器的底层机制均以RB-tree 2024-08-24 C语言编程拾遗 > STL源码剖析 #C语言编程拾遗 #STL源码剖析
TinyKV的启动流程 TinyKV的启动流程我们先看./kv/main.go的main函数。 123456789var storage storage.Storageif conf.Raft { storage = raft_storage.NewRaftStorage(conf)}...if err := storage.Start(); err != nil { log.Fatal(e 2024-08-24 分布式系统 > TinyKV #分布式系统 #TinyKV
TinyKV两阶段提交 TinyKV两阶段提交这部分可以参考TinySql(这可以看成是TinyKV的客户端)的实现,入口函数是tikvTxn.Commit,函数在文件store/tikv/txn.go中。我们这里只讲解一下两阶段提交的大致流程,了解一下比较工业级的二阶段锁大致是如何用代码实现的,不会太深入到琐碎的细节中。 12345func (txn *tikvTxn) Commit(ctx context.Conte 2024-08-24 分布式系统 > TinyKV #分布式系统 #TinyKV