Monthly Read Posts in July 2019

Programming Languages

Go: Understand the Design of Sync.Pool

Read More

学习 MySQL 的一些吐槽

最近学习 MySQL 的过程中发现一些很坑的点,总结记录如下:

  1. RDBMS 虽然理论很早就有了,但是近些年的实际应用进化已经导致各家独立。不同引擎实现不同,甚至连 spec 都不同。
  2. 不考虑 Oracl, SQL Server 这种传统行业使用的,PostgreSQL 和 MySQL 之间差异性也不小,体现在 transaction, locking 上。甚至 MariaDB 和 MySQL 未来的差异可能也会变大。

Read More

Monthly Read Posts in June 2019

Concurrency

Memory Barriers Are Like Source Control Operations

Read More

实现 compressed pair

C++ 的 std::unique_ptr 有个神奇的特性:如果使用默认的 deleter(即使用 operator delete),或者 non-capturing lambda 作为 deleter,则有

1
sizeof(std::unique<T>) == sizeof(void*);

即整个对象的内存布局和 trivial pointer 一致,没有额外的开销。

这个特性的背后就是 compress-pair;这个设施能够在某个元素是一个 empty class 时避免为其分配内存。

注:这里假设你知道什么是 EBO,以及为什么会有 EBO。

这里自己动手实现一个 compressed pair:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
template<typename Tx, typename Ty, bool = std::is_empty<Tx>::value>
struct CompressedPair : Tx {
Ty second;

template<typename T>
explicit CompressedPair(T&& t)
: Tx(),
second(std::forward<T>(t))
{}

template<typename T, typename U>
CompressedPair(T&& t, U&& u)
: Tx(std::forward<T>(t)),
second(std::forward<U>(u))
{}

Tx& get_first() noexcept
{
return *this;
}

const Tx& get_first() const noexcept
{
return *this;
}
};

template<typename Tx, typename Ty>
struct CompressedPair<Tx, Ty, false> {
Tx first;
Ty second;

template<typename T, typename U>
CompressedPair(T&& t, U&& u)
: first(std::forward<T>(t)),
second(std::forward<U>(u))
{}

Tx& get_first() noexcept
{
return first;
}

const Tx& get_first() const noexcept
{
return first;
}
};

因为 EBO 是实现的核心,而父类的构造顺序先于子类的任何成员,上面将 Tx 作为可被优化的成员。

Read More

为 CommandLine 加上值指定类型转换以及一些扯淡

过去两周抽了点时间给 KBase::CommandLine 做了一个变更,重新设计了 parameter 和 switch 的用户访问接口。

Read More

Monthly Read Posts in May 2019

Concurrency

Roll Your Own Lightweight Mutex

Read More

基于 semaphore 实现轻量级 mutex

核心是 Jeff Preshing 大牛的两篇文章

Read More