学习 MySQL 的一些吐槽
最近学习 MySQL 的过程中发现一些很坑的点,总结记录如下:
- RDBMS 虽然理论很早就有了,但是近些年的实际应用进化已经导致各家独立。不同引擎实现不同,甚至连 spec 都不同。
- 不考虑 Oracl, SQL Server 这种传统行业使用的,PostgreSQL 和 MySQL 之间差异性也不小,体现在 transaction, locking 上。甚至 MariaDB 和 MySQL 未来的差异可能也会变大。
最近学习 MySQL 的过程中发现一些很坑的点,总结记录如下:
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 | template<typename Tx, typename Ty, bool = std::is_empty<Tx>::value> |
因为 EBO 是实现的核心,而父类的构造顺序先于子类的任何成员,上面将 Tx
作为可被优化的成员。
前段时间专门抽空做了一个小工具,也就是这里要讲的主题:anvil
一开始做 anvil 的动力很简单:某次尝试体验一下 Linux SignalFD 功能时想直接使用 ezio 的 EventLoop
作为基础事件循环,同时项目使用 cmake 管理。
为了省事,我直接从 ezio 的项目里抠出来 CMakeLists.txt
和几个自己写的 .cmake
文件,就地修改。
但事实证明哪怕这样,改动量也不小,原因大体是因为:cmake 里(非函数内定义的)变量作用域是全局的,通过 fetch-content 功能引入的依赖在 add_subdirectory()
后的模块里也能看到上一层定义的变量,因此为了防止一些控制型变量发生冲突,我都在前面加上了对应的模块前缀。
所以我面对的就是一大坨变量名的更换,以及少部分声明/属性的调整。
考虑到大部分的文件内容都是可以模板化的,而手动“实例化”不仅费事还很容易出错,所以我就很自然地萌生了写一个工具自动化这个过程的想法。
在经过一两天的短暂思考后,我大致确定了这个工具的定位和需要实现的基本目标,总结起来有三个核心点:
首先,第一点是重中之重。