对于熟悉 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 将一个文件或者其它对象映射进内存。文件被映射到多个页上,如果文件的大小不是...
1. 概览
要谈论 LevelDB 的 Compaction 就不得不从 LevelDB 的整个数据写入流程入手。LevelDB 的基本写入流程大致为:
- 数据先写入到 WAL 日志中,做持久化
- 然后数据同步到
mutable memtable
中 - 当
mutable memtable
大小达到Options.write_buffer_size
设置的大小时,就会变成immutable memtable
,并且创建一个新的mutable memtable
- 后台的 Compaction 线程会把
immutable memtable
dump 成 sstable 文件,并设置于 Level 0 层 - 当 Level i 达到一定条件后,...
什么是 BDD
BDD(Behavior Driven Development),行为驱动开发,是一种敏捷软件开发的技术,它鼓励软件项目中的开发者、QA 和非技术人员或商业参与者之间的协作。
BDD 的重点是通过与利益相关者的讨论取得对预期的软件行为的清醒认识。它通过用自然语言书写非程序员可读的测试用例扩展了测试驱动开发方法。行为驱动开发人员使用混合了领域中统一的语言的母语语言来描述他们的代码的目的。这让开发者得以把精力集中在代码应该怎么写,而不是技术细节上,而且也最大程度的减少了将代码编写者的技术语言与商业客户、用户、利益相关者、项目管理者等的领域语言之间来回翻译的代价。
具体怎么操作
结合我们项目开发使用的 spring...
开始之前
这篇文章主要是为了帮助大家熟悉 POSIX 线程库以及在实际开发中使用它的特性。我们会具体讲解如何利用这个线程库定义的不同工具 来解决编程中的问题。当然这里隐含了一个假设,就是读者已经了解过并行编程(或者多进程)的相关概念,如果没有这些背景知识 的话,读者可能会感觉到很难理解。不过也没关系,我的另一篇教程里边有专门为只具备线性编程思维的读者提供了对并行编程理论 和相关术语的讲解。
同样的,我假设聪明的你已经熟悉了异步编程模型,那些经常使用桌面环境的人会更容易去接受多线程编程的理念。
当我们谈到 POSIX 线程的时候,肯定会有人心生疑惑:“我们应该使用哪个标准下的 POSIX 线程?”。由于 POSIX 线程标准已经修订...