Skip to content

Commit 822cd7d

Browse files
committed
fix lambda typo
1 parent 168e468 commit 822cd7d

File tree

4 files changed

+27
-20
lines changed

4 files changed

+27
-20
lines changed

docs/cpp_tricks.md

+9-9
Original file line numberDiff line numberDiff line change
@@ -1889,12 +1889,12 @@ int a = f & 0xF; // 0x1
18891889
int b = f >> 4; // 0x2
18901890
```
18911891

1892-
<!-- ## vector + unordered_map = LRU cache -->
1893-
<!-- -->
1894-
<!-- ## Lambda 捕获 unique_ptr 导致 function 报错怎么办 -->
1895-
<!-- -->
1896-
<!-- ## 多线程通信应基于队列,而不是共享全局变量 -->
1897-
<!-- -->
1898-
<!-- ## RAII 的 finally -->
1899-
<!-- -->
1900-
<!-- ## swap 缩小 mutex 区间代价 -->
1892+
## vector + unordered_map = LRU cache
1893+
1894+
## Lambda 捕获 unique_ptr 导致 function 报错怎么办
1895+
1896+
## 多线程通信应基于队列,而不是共享全局变量
1897+
1898+
## RAII 的 finally
1899+
1900+
## swap 缩小 mutex 区间代价

docs/interview.md

+1
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@
9494
- 小彭老师推销:这导致你在cpp文件中定义非POD类会被坑,因为类体内就地定义的成员函数,默认是inline的,包括默认构造函数,当时导致zeno调试了半天(面试官表示他之前集成一个开源库也遇到这个坑,小彭老师表示可以套匿名namespace解决)
9595
- push_back vs emplace_back(2重载vs万能引用+变长参数,emplace可以就地带任意参数构造你的元素类型,emplace的额外好处是触发explicit的构造函数而无需显式写出类名,也带来了危险,所以我在课程中都不推荐使用,如需避免移动可以`vector<unique_ptr<T>>`,这还能使扩容时也不触发移动)
9696
- 什么情况下不会移动?面试官似乎在试探我是否了解 vector 扩容原理(只有当size>capacity时才会触发,每次触发扩容时gcc增加到2 x size,msvc则是1.5 x size,总共2n次操作,好处是保证了总体O(n)复杂度,我们建议知道长度的情况下,可以调用reserve提前预订100的capacity,这样只有推入第101个元素才会扩容到200,小彭老师顺便推销了vector, deque, list的区别,迭代器失效原因)
97+
- 还问了万能引用和完美转发的原理(引用折叠)
9798
- 什么是POD(基础类型、指针、无用户构造函数的纯基础类型组成的结构体)
9899
- 小彭老师反向提问:vector超缓存大resize导致memset性能影响?(拿出我的tbb课程的parallel_filter案例,利用pod模板,面试官表示熟悉缓存,不用提问了)
99100
- 面试官提问PIMPL模式(写C::Impl给他看,又问PIMPL的目的是什么,一开始答:分离定义,加速编译,问还有什么作用吗?保持abi稳定,不用重新编译依赖者,可用于插件热装载)

docs/lambda.md

+12-8
Original file line numberDiff line numberDiff line change
@@ -1098,7 +1098,7 @@ int ret = lambda.operator() ();
10981098
auto lambda = [] (int a) {
10991099
return a + 1;
11001100
};
1101-
int ret = lambda();
1101+
int ret = lambda(2);
11021102
```
11031103

11041104
实际被编译器翻译成:
@@ -1110,7 +1110,7 @@ struct Lambda {
11101110
}
11111111
};
11121112
Lambda lambda;
1113-
int ret = lambda.operator() ();
1113+
int ret = lambda.operator() (2);
11141114
```
11151115
11161116
而捕获了变量的:
@@ -1120,7 +1120,7 @@ int x = 4;
11201120
auto lambda = [&x] (int a) {
11211121
return a + x;
11221122
};
1123-
int ret = lambda();
1123+
int ret = lambda(2);
11241124
```
11251125

11261126
实际被编译器翻译成:
@@ -1132,12 +1132,12 @@ struct Lambda {
11321132
Lambda(int &x_) : x(x_) {}
11331133

11341134
int operator() (int a) const {
1135-
return a + 1;
1135+
return a + x;
11361136
}
11371137
};
11381138
int x = 4;
11391139
Lambda lambda(x);
1140-
int ret = lambda.operator() ();
1140+
int ret = lambda.operator() (2);
11411141
```
11421142
11431143
#### 闭包捕获变量的生命周期问题
@@ -1306,14 +1306,18 @@ fmt::println("lambda.x = {}", lambda.x); // 编译错误💣编译器产生的
13061306
- 按值移动捕获 `[x = std::move(x)]`
13071307
- 按引用捕获 `[&x]`
13081308
1309-
TODO
1310-
13111309
批量捕获:
13121310
13131311
- 按值拷贝捕获所有用到的变量 `[=]`
13141312
- 按引用捕获所有用到的变量 `[&]`
13151313
1316-
TODO:与语法糖解构后比较
1314+
按值拷贝捕获:
1315+
1316+
```cpp
1317+
int x = 4;
1318+
auto lambda = [x] (int i) {
1319+
};
1320+
```
13171321

13181322
### 类型推导
13191323

docs/llvm_intro.md

+5-3
Original file line numberDiff line numberDiff line change
@@ -692,7 +692,7 @@ LLVM IR 中的基础类型有:
692692

693693
> {{ icon.tip }} “定义-使用”和“使用定义”是两个互逆的映射。不过要注意,他们都不是一一映射:一个寄存器可以被多个其他寄存器重复使用,一个寄存器的定义也可能使用到了多个其他寄存器。
694694
695-
##### “使用-定义”映射
695+
**“使用-定义”映射**
696696

697697
由于指令在他的源操作数中指定了操作数来自哪个寄存器,“使用-定义”关系是 IR 天生自带的,直接通过 IR 节点的 `op` 成员函数,就能查到他使用了哪些其他寄存器(或常数)。
698698

@@ -704,13 +704,13 @@ for (llvm::Use &U: pi->operands()) {
704704
}
705705
```
706706

707-
##### “定义-使用”映射
707+
**“定义-使用”映射**
708708

709709
而“定义-使用”关系,就需要我们自己构建了。
710710

711711
幸运的是,LLVM 给我们提供了一个方便的分析工具,来自动构建这个关系:`def-use` pass。
712712

713-
#### 优化与分析 pass
713+
### 优化与分析 pass
714714

715715
LLVM 中的 pass,是指一组对 IR 进行操作的函数。pass 分为分析类 pass 和优化类 pass。
716716

@@ -1300,6 +1300,8 @@ llvm-as test.ll -o test.bc
13001300
llvm-dis test.bc -o test.ll
13011301
```
13021302

1303+
> {{ icon.tip }} 再次提醒:这些是 LLVM 内部的 IR 的两种形式,并不是真正的汇编和机器码。
1304+
13031305
#### 一一对应的翻译关系
13041306

13051307
IR 字节码和 IR 汇编的关系,正如 x86 汇编和 x86 机器码的关系,之间是一一对应的翻译关系。

0 commit comments

Comments
 (0)