chai2010

Results 97 comments of chai2010

Foo_returns 是为了展示重新对齐的需求(类似数组的第二个元素),放前面则不完全一样

Goroutine和线程的本质区别:Go编译器认识Goroutine的Go语法,可以开很多优化后门;而OS不认识写线程的编程语言,只能采用保守策略。

零长的数组好像是C99的特性,如果C++不支持可以用 `float arr[1]` 先绕过

感动 👍👍👍

TLS属于线程局部空间,对于不同的线程是不同的。有些CPU禁止直接读取TLS的内容到寄存器, 因此需要先获取TLS地址到寄存器,再通过寻址的方式读取。 简单来说 `MOVQ (TLS), CX` 就是读取 TLS 表示地址指向的内存的数据,对应C语言的二级指针 `CX = **TLS`。 要在一条汇编指令实现C语言的二级指针读取肯定是比较困难的,因此就有了前面的2个指令写法: ``` MOVQ TLS, AX MOVQ 0(AX)(TLS*1), CX // load g into CX ``` `0(AX)(TLS*1)`其实是`0(AX)`,后面的`(TLS*1)`属于一个注解信息, 告诉link要针对不同的线程处理不同的偏移量(每个线程的TLS和和线程编号有相关性)。 `(TLS*1)`这种注解写法其实是有一定的歧义风险的,但是因为Go语言值需要用TLS保存一个g指针所有不会出现冲突。 说到底,Go的汇编语言是一种高级编译语言,还需要进行一次编译才能到底层机器的汇编。...

`0(AX)(TLS*1)`是合法的汇编语法,但是Go汇编不会出现`(TLS*1)`。因此语法虽然没有错误,但是非法的语义。将某些符合语法但是语义非法的代码作为特殊的用途是常见的技巧(比如有人在浮点数的Nan里面隐藏一些标志信息),区分是没有问题的。 `MOVQ TLS, AX`是一个独立的指令,这会需要引入上下文的信息。不是不行,而是涉及上下文会把汇编器的代码搞的更复杂。当然,如果这个工具是其他人写的,或许又是不同的解法。 另外,如果省略`(TLS*1)`就会变成`MOVQ 0(AX), CX`,这可能不是一个正确的寻找语法(间接寻址需要2个寄存器)。

所谓的内存泄漏是指进程还没有死的时候。如果main函数退出进程就死了,泄漏也不是问题了

是的,getg如果返回`interface{}`,就可以通过reflect获取成员偏移量了

171页第一个代码段改为: ```go func LoopAdd(cnt, v0, step int) int { result, vi := 0, v0 for i := 0; i < cnt; i++ { result, vi = result+vi, vi+step } return...