数据库中的连接操作

前言

在介绍一下的内容之前,先介绍两个表:R和 S,内容如下:

表 R

ABC
a1b11
a2b22
a3b23
a4b34

表 S

BD
b15
b26
b47

笛卡尔积

两个表的笛卡尔积定义为:

\begin{equation} R \times S = \{<t,g> \mid t \in R \quad AND \quad g \in S\} \end{equation}

多线程中的生产者消费者模型

线程的概念

为了减少程序并发执行的时空开销,使得并发粒度更细,并发性更好,把进程的两项功能(独立分配资源和被调度分派执行)分开得到线程。线程是操作系统进程中能够独立执行的实体,是处理器调度和分派的基本单位。

emacs的启动过程

启动过程总结

emacs 启动在 lisp 源码里的顶级目录中的 startup.el 文件,如

/usr/share/emacs/26.1/lisp/startup.el

  1. 运行 load-path 里面每个目录中的 subdirs.el 文件,递归的把所有把子目录添加到路径中。

  2. 运行 load-path 中找到的用户创建的 leim-list.el 文件,Emacs 自带的忽略掉。这个文件用于注册输入法。

Linux sed 命令的用法

sed 命令

简介

sed 是一个按行处理基本文本的流式处理命令,stream editor 的缩写。它每次只能处理输入文本中的一行,输入的文本可以来自文件或者管道。 sed 常常用于过滤输入的文本,快速的替换等。具体看下面的讲解。

C++ 的右值引用

指针成员与拷贝构造

在 C++中,如果一个类中有一个指针成员,就要特别注意拷贝构造函数,一不小心就会出现内存泄露。一个经典的浅拷贝例子:

 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
#include <iostream>

using namespace std;

class HasPtrMem {
  public:

    HasPtrMem() : d(new int(0)) {
    }

    HasPtrMem(const HasPtrMem& h) : d(h.d) {
    // 直接赋值,导致a.d和b.d指向同一位置
    }

    ~HasPtrMem() {
    delete d;
    }

    int* d;


};


int main() {
    HasPtrMem a;
    HasPtrMem b(a); // 调用隐式拷贝构造函数

    cout << *a.d << endl;
    cout << *b.d << endl; // delete悬空指针,出现异常


}

稍微改下实现深拷贝