rebase和merge的区别详解
引言当你正在开发一个新的功能,准备合并回主分支时,可能会发现存在很多冲突。此时究竟应该用合并还是变基呢? 合并(merge)一个典型的例子是,从节点A开始,团队开发了B和C功能并合并到了主分支,而你在一个特性分支开发了D和F。执行git checkout main命令切换到主分支后,再运行git merge feature将特性分支合并进来。此时,git会创建一个新的提交$\hat{E}$,它将两
C++内存管理机制——loki::allocator
上中下3个classloki::allocator中包含3个类,从上层至下层分别为SmallObjAllocator、FixedAllocator和Chunk。 ChunkInit是由上层的类来调用的,不会提供给用户。其会申请blockSize * blocks大小的内存,并调用Reset来重置第一块可以使用的的内存索引firstAvailableBlock_为0,可使用的块数量blocksAv
使用CRTP实现上下文限值
前言本工程使用CRTP实现编译阶段控制权限的Context数据访问框架。具体目标为: 给不同的节点 Node 提供访问 DictContext 的能力。同时用模板 + static_assert 保证:Node 只能读 IN_KEYS,写 OUT_KEYS。否则编译报错。 PermissionKey——Key的类型系统1234567891011121314151617181920212223/
CRTP:奇异递归模板
前言CRTP(Curiously Recurring Template Pattern),奇异递归模板是一种特征的模板技术,其特征为: 基类是一个模版类 派生类继承该基类时,将派生类自身作为模板参数传递给基类 CRTP范例CRTP的一个范例如下,Base类通过static_cast将基类指针转换为派生类。由于没有动态类型检查,这个过程是不一定安全的。但Base<Derived>是利
C++内存管理机制——malloc_free
VC6 VS VC10VC6内存分配下面的图片展示了VC6内存分配的调用栈,操作系统会调用mainCRTStartup()做一些准备工作,然后才会调用程序编写者的main()函数。在_heap_alloc_base()函数中,如果申请的内存大小小于_shb_threshold,则会通过_sbh_alloc_block(size)申请内存,否则通过操作系统的HeapAlloc()申请内存。 SBH
C++内存管理机制——std::allocator
mallocvc6.0 malloc 上图展示了VC6.0中malloc()函数分配的内存。vc6.0的malloc()是一定会携带cookie的,且固定占用8个字节。蓝色部分是申请的内存,假定为12个字节,表示为16进制下的0xC。debug heder和tail由灰色的块组成,每个块4个字节,因此共占32+4个字节。上下cookie占用4*2个字节。上述所有信息共占据0xC+(32+4)+4*
C++内存管理机制——primitives
内存分配的每个层面C++的内存管理方式有如下四种,一般不直接使用操作系统的API进行管理,以尽可能避免与特定操作系统绑定。 四种内存操作方法的特性如下: new/detele expression内存申请通过new进行内存申请的过程: 通过operator new()操作分配一个目标类型大小的内存,图中为Complex的大小。 通过static_cast将得到的内存块强制转化为目标类型