作者回复: 因为栈是从高地址向低地址延伸的。所以地址减的话,才是栈的增长。
作者回复: 回头我更新一版图,让图中的箭头指向格子而不是线,这样更加没有歧义。
作者回复: 鼓励你用c语言,使用malloc和free来申请和释放内存,看看生成的汇编是怎样的。
作者回复: 不是。
rbp,指向栈底。这个值在整合函数执行期间是不变的。
rsp,指向栈顶。这个值会在某些情况下改变:
(1)push和pop命令可以改变rsp。
(2)call指令,因为要把返回地址压栈,实际也改变了rsp。
(3)在使用本地变量时,手工改变rsp的值。
rsp如果指向下次要保存数据的位置,相当于栈里总有一个空单元。
作者回复: 没错。用两个寄存器来标记栈桢,确实有点浪费。实际上是可以优化掉的。
如果你用gcc编译的话,可以使用-fomit-frame-pointer参数来生成汇编,会把下面三行代码都去掉。
pushq %rbp
movq %rsp, %rbp
popq %rbp
我在34讲的一个例子中,手工去掉了这三行代码,生成的机器码可以少5个字节,还少两次内存访问,其中有一次是写操作,高速缓存都帮不上忙。对于追求极致性能的程序来说,这个优化是必要的。
作者回复: 非io当然可以用协程。比如迭代器、状态机用协程来写就很优雅。
作者回复: macOS操作系统,gnu汇编器。
Linux上生成的汇编码应该也差不多,有些系统调用是不同的。
windows上,你就要安装一下相关的环境了和工具了,比如MinGW。或者装一个Linux虚拟机。