LevelDB 源码阅读:Posix 文件操作接口实现细节

LevelDB 支持在各种操作系统上运行,为了适配不同的操作系统,需要封装一些系统调用,比如文件操作、线程操作、时间操作等。在对外暴露的 include 文件中,env.h 文件定义了 LevelDB 用到的各种接口。包括 Env 类,封装文件操作,目录操作等,还有一些文件抽象类,比如 SequentialFile、WritableFile、RandomAccessFile 3 个类,用于顺序读取,随机读取和写入文件。

通过抽象接口,只需要为每个平台实现相应的 Env 子类,LevelDB 就可以在不同的操作系统上运行。这篇文章以 POSIX 系统环境为例,先来看看抽象出来的和文件操作相关的接口是怎么实现的。

阅读全文

LevelDB 源码阅读:禁止对象被析构

LevelDB 源码中有一个获取 Comparator 的函数,第一次看到的时候觉得有点奇怪,看起来像是构造了一个单例,但又略复杂。完整代码如下:

1
2
3
4
5
// util/comparator.cc
const Comparator* BytewiseComparator() {
static NoDestructor<BytewiseComparatorImpl> singleton;
return singleton.get();
}

这里的 NoDestructor 是一个模板类,看名字是用于禁止对象析构。为什么要禁止对象析构,又是如何做到禁止析构呢?这篇文章来深入探讨下这个问题。

阅读全文

免费版 Claude3.5 配合 Artifacts,一句话就能写个游戏

Anthropic 不声不响地发布了 Claude 3.5 模型,除了模型效果提升,还支持了 Artifacts。初步体验后,感觉这才是未来 AI 的样子,比之前 GPT4-o 更让我震撼。

Artifacts 工作空间内写代码Artifacts 工作空间内写代码

在 Artifacts 之前,如果想用 ChatGPT 等 LLM 来帮忙实现程序功能,需要先提功能需求,然后复制 AI 的代码到自己的环境中运行。如果和预期不符合,要再追问、再修改代码运行。需要重复这个过程,直到满意或者放弃(有些复杂代码目前 AI 还是写不太好)。

阅读全文