chai2010/advanced-go-programming-book

图 3-13 函数调用参数布局

ioworker0 opened this issue · 2 comments

提示:哪一章节的问题,建议如何修改
local 顺序画反了,local 0应该比local 1 地址要大,位置应该在上。

@chai2010 ,这里是不是确实有点问题

(dlv) n
> main.main() ./local.go:6 (PC: 0x105817f)
     1:	package main
     2:
     3:	func main() {
     4:		var a = 1
     5:		var b = 2
=>   6:		println(a, b)
     7:	}
(dlv) p &a
(*int)(0xc000034748)
(dlv) p &b
(*int)(0xc000034740)
(dlv)

local0和local1是什么顺序,其实和语言实现有关,怎么排列甚至优化成常量都可以。文中的类比是让大家更好理解,展示的是一种和参数布局一样规则的可能的实现。因为参数先出现的是小地址,而参数也是类似局部变量的,可以类比出局部变量先出现的也是小地址(当然,这个结论不成立)。

读者能发现这个问题,说明在思考底层实现的细节,这是很赞的。我只给一个建议,在通过看汇编理解了实现的细节后,需要反思为何要这样实现,是否可以不这样实现,实现和设计有何关系等问题。

感谢指出,这个本来就不是严格的结论,因此书中说的比较模糊,这是刻意的。
我们要以一种最低的规则,拟合出一种可能的并易于理解的实现原理。