对于熟悉 c99 的人来说,Designated Initializers 并不算是什么新鲜事物,然而 c++直到 c++20 才正式支持这一特性。 虽然在 c++20 之前,像 GCC 这样的编译器通过扩展的形式已经对该特性做了支持,但是随着 c++20 将其纳入新标准,这一特性将在所有编译器中得到支持。

基本用法

Designated Initialization 是聚合初始化(Aggregate Initialization)的一种形式。 在 c++20 中,聚合类型(Aggregate types)是指:

  • 数组类型
  • 具备如下特性的 class 类型:
    • has no private or protected...

前言

做存储开发,一定会经常涉及到 IO 相关的操作。而现在的高级编程语言,往往会帮助我们屏蔽 IO 操作的底层细节,虽然这样能降低开发门槛,提升效率,但是却也导致我们对 IO 底层操作实现的理解不够系统和深入。 所以呢,我一直想抽时间来系统整理一下 Linux IO 涉及的系统调用,以及相互之间的区别和联系,以加深对 IO 操作的理解。

IO 操作

fwrite

fwrite 是 c 语言标准库中的文件写入函数,其作用是向指定的文件中写入若干数据。调用 fwrite 实际上是将数据写入到了 c 标准库的 IO Buffer 中。

mmap

mmap 将一个文件或者其它对象映射进内存。文件被映射到多个页上,如果文件的大小不是...

对于一个标准的 c++容器来说,我们可以很容易在运行时使用迭代器和 range-based for loop 来遍历其中的每一个元素。但是对于std::tuple,却不能像普通的容器那样去遍历它。

std::tuple 简介

std::tuple是一个具有固定大小,包含不同类型值的集和。与之相似的是std::pair,只不过std::pair只能容纳两个元素, 而std::tuple可以容纳许多元素:

1std::tuple<int, double, const char*> tup {42, 10.5, "hello"};
2
3// or with CTAD(class template...

string_view 简介

std::string_view是 c++17 中新增的一种类型。其核心理念是,能够让我们在传统的 C++03 风格的具体性和泛型编程之间找到一个很好的折衷点。 在 C++17 标准之前,我们通常只能在粗糙的不严谨的模板实现和相对严谨但是有着冗长约束的模板之间做出选择。举个简单的例子:

 1// c++03 style
 2class Widget
 3{
 4    std::string name_;
 5
 6public:
 7    void setName(const char* new_name);
 8    void setName(const std::string&...

1. 概览

要谈论 LevelDB 的 Compaction 就不得不从 LevelDB 的整个数据写入流程入手。LevelDB 的基本写入流程大致为:

  1. 数据先写入到 WAL 日志中,做持久化
  2. 然后数据同步到mutable memtable
  3. mutable memtable大小达到Options.write_buffer_size设置的大小时,就会变成immutable memtable,并且创建一个新的mutable memtable
  4. 后台的 Compaction 线程会把immutable memtabledump 成 sstable 文件,并设置于 Level 0 层
  5. 当 Level i 达到一定条件后,...

拜占庭将军问题

简介

  • 在可能存在叛军的情况下,采用合适的通讯协议,让多个将军达成共识,执行统一的作战计划
  • 二忠一叛难题
  • 它是分布式领域最复杂的容错模型
  • 莱斯利·兰伯特(Leslie Lamport)The Byzantine Generals Problem

二忠一叛难题

  • 总共有三个将军,其中一个作为指挥官
  • 通过信使相互传递作战指令,进攻或者撤退
  • 所有忠诚的将军必须执行统一的作战计划,忠诚的将军必须执行忠诚的指挥官发布的指令
  • 假如 LIEUTENANT2 叛变,LIEUTENANT1 收到的作战指令就是“进攻,撤退”
  • 假如 COMMANDER 叛变,LIEUTENANT1 和 LIEUTENANT2 收到...

背景

我们 laser 存储为了更好的跟引擎对接,适应其他团队的技术生态,决定开发一套 golang 的公共库来给大家使用。于是我们在公司私有的 gitlab 上新建了一个项目:git.yourcomp.com/ad/ads_core/adgo,并且我们想使用单一的 codebase 来管理所有的公共 library.

而且,为了更好的管理模块,我们统一使用了 go mod。

按照平时我们在 github 上拉取 go library 的惯例,我本以为直接使用go get git.yourcomp.com/ad/ads_core/adgo/xxx就能直接拉取到相应的模块了,然而在开发完功能测试的时候却发现,事实并不是想象中那样。...

使用 c 语言的 macro 操作,能够很简单的用 c 语言模拟 lisp 语法。

下面我们来定义 lisp.h 头文件

 1#ifndef LISP_H_OTE1HWPK
 2#define LISP_H_OTE1HWPK
 3
 4#include <stdio.h>
 5#include <stdlib.h>
 6
 7#define define(ret, name, args, block) \
 8    ret name args { return block; }
 9
10#define if(expr, block1, block2) \
11    expr ? block1 :...

什么是 BDD

BDD(Behavior Driven Development),行为驱动开发,是一种敏捷软件开发的技术,它鼓励软件项目中的开发者、QA 和非技术人员或商业参与者之间的协作。

BDD 的重点是通过与利益相关者的讨论取得对预期的软件行为的清醒认识。它通过用自然语言书写非程序员可读的测试用例扩展了测试驱动开发方法。行为驱动开发人员使用混合了领域中统一的语言的母语语言来描述他们的代码的目的。这让开发者得以把精力集中在代码应该怎么写,而不是技术细节上,而且也最大程度的减少了将代码编写者的技术语言与商业客户、用户、利益相关者、项目管理者等的领域语言之间来回翻译的代价。

具体怎么操作

结合我们项目开发使用的 spring...