Skip to content

Commit 16f8572

Browse files
committed
updatellvmintro
1 parent f9863f7 commit 16f8572

8 files changed

+394
-35
lines changed

docs/extra.js

+6-6
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,13 @@ for (var i = 0; i < links.length; i++) {
2424
}
2525
}
2626

27-
var llvms = document.querySelectorAll('code.language-llvm');
28-
for (var i = 0; i < llvms.length; i++) {
29-
var llvm = llvms[i];
27+
var nasms = document.querySelectorAll('code.language-nasm');
28+
for (var i = 0; i < nasms.length; i++) {
29+
var nasm = nasms[i];
3030
// add class .language-wasm .hljs
31-
llvm.classList.add('language-wasm', 'hljs');
32-
// remove class .language-llvm
33-
llvm.classList.remove('language-llvm');
31+
nasm.classList.add('language-x86asm', 'hljs');
32+
// remove class .language-nasm
33+
nasm.classList.remove('language-nasm');
3434
}
3535

3636
var stylesheets = [
23.7 KB
Loading

docs/img/llvm-module.png

58.7 KB
Loading

docs/img/llvm-register-lifespan.png

22.8 KB
Loading

docs/llvm_intro.md

+302-26
Large diffs are not rendered by default.

docs/undef.md

+71-2
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,6 @@ void func(){
110110
```cpp
111111
int i;
112112
float f = *(float *)&i; // 错!
113-
*(int *)(uintptr_t)&i; // 可以
114113
```
115114

116115
例外:char、signed char、unsigned char 和 std::byte 总是兼容任何类型
@@ -121,6 +120,31 @@ char *buf = (char *)&i; // 可以
121120
buf[0] = 1; // 可以
122121
```
123122

123+
> uint8_t 是 unsigned char 的别名,所以也兼容任何类型
124+
125+
例外:int 和 unsigned int 互相兼容
126+
127+
```cpp
128+
int i;
129+
unsigned int f = *(unsigned int *)&i; // 可以
130+
```
131+
132+
例外:const int * 和 int * 互相兼容(二级指针强转)
133+
134+
```cpp
135+
const int *cp;
136+
int *p = *(int **)&cp; // 可以
137+
```
138+
139+
注意:只取决于访问时的类型是否正确,中间可以转换为别的类型(如 void * 和 uintptr_t),只需最后访问时转换回正确的指针类型即可
140+
141+
```cpp
142+
int i;
143+
*(int *)(uintptr_t)&i; // 可以
144+
*(int *)(void *)&i; // 可以
145+
*(int *)(float *)&i; // 可以
146+
```
147+
124148
### union 访问不是激活的成员
125149

126150
```cpp
@@ -199,6 +223,51 @@ char buf[sizeof(int) * 2];
199223
int *p = (int *)(((uintptr_t)buf + sizeof(int) - 1) & ~(alignof(int) - 1)); // 可以
200224
```
201225

226+
### 从父类 static_cast 到不符合的子类后访问
227+
228+
```cpp
229+
struct Base {};
230+
struct Derived : Base {};
231+
232+
Base b;
233+
Derived d = *(Derived *)&b; // 错!
234+
Derived d = *static_cast<Derived *>(&b); // 错!
235+
Derived d = static_cast<Derived &>(b); // 错!
236+
```
237+
238+
```cpp
239+
Derived obj;
240+
Base *bp = &obj;
241+
Derived d = *(Derived *)bp; // 可以
242+
Derived d = *static_cast<Derived *>(bp); // 可以
243+
Derived d = static_cast<Derived &>(*bp); // 可以
244+
```
245+
246+
### bool 类型不得出现 0 和 1 以外的值
247+
248+
布尔类型 bool,只有 true 和 false 两种取值。
249+
250+
bool 虽然占据 1 字节(8 位)内存空间,但其中只有一个有效位,也就是最低位。
251+
252+
只有这个最低位可以是 0 或 1,其余 7 位必须始终保持为 0。
253+
254+
如果其余位中出现了非 0 的位,也就是出现 0 和 1 以外的取值,则是未定义行为。
255+
256+
```cpp
257+
char c = 0;
258+
bool b = *(bool *)c; // 可以,b = false
259+
```
260+
261+
```cpp
262+
char c = 1;
263+
bool b = *(bool *)c; // 可以,b = true
264+
```
265+
266+
```cpp
267+
char c = 2;
268+
bool b = *(bool *)c; // 未定义行为
269+
```
270+
202271
## 算数类
203272

204273
### 有符号整数的加减乘除模不能溢出
@@ -431,7 +500,7 @@ int func(int x) {
431500
432501
但也有例外:
433502
434-
1. `main` 函数可以不写 `return` 语句,默认自带 `return 0;`
503+
1. 主函数 `main` 可以不写 `return` 语句,默认自带 `return 0;`
435504
2. 协程函数可以不写 `return` 语句,如果有 `co_return` 或者协程返回类型为 `void` 且具有至少一个 `co_await` 出现
436505
437506
### 函数指针被调用时,不能为空

misc/typst/cppguidebook.typ

+1-1
Original file line numberDiff line numberDiff line change
@@ -304,7 +304,7 @@ C++ 源码 `.cpp` 是写给人类看的!计算机并不认识,计算机只
304304

305305
=== MSVC
306306

307-
```cmd
307+
```bash
308308
cl.exe /c main.cpp
309309
```
310310

mkdocs.yml

+14
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,20 @@ theme:
4848
features:
4949
- search.suggest
5050
- search.highlight
51+
highlightjs: true
52+
hljs_languages: # rg '^```\w+' | sed 's/.*:```\(\w*\)/ - \1/g' | sort | uniq
53+
- bash
54+
- c
55+
- cmake
56+
- cpp
57+
- diff
58+
- java
59+
- json
60+
- llvm
61+
- nasm
62+
- python
63+
- rust
64+
- txt
5165
extra_javascript:
5266
- extra.js
5367
- https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML

0 commit comments

Comments
 (0)