golang函数调用是栈(sp)会push一个指针,查看指针是什么

xxx小M · · 95 次点击 · · 开始浏览    
package main
import "unsafe"
// @Time    : 2020-10-28 18:49
// @Author  : mu
// @File    : sp_address.go
func funAddr(i int) (v int) {
   bp := (*int64)((unsafe.Pointer)(uintptr(unsafe.Pointer(&i)) - uintptr(16)))
   println("bp", unsafe.Pointer(uintptr(*bp)))
   fun := (*int64)((unsafe.Pointer)(uintptr(unsafe.Pointer(&i)) - uintptr(8)))
   println("fun", *fun)
   t2 := unsafe.Pointer(&i)
   println(t2)
   b := funAddB
 c := *(*int64)(unsafe.Pointer(&b))
   d := (*int64)(unsafe.Pointer(uintptr(c)))
   println("d", *d)
   println("diff", *fun - *d)
   println("funAddB", funAddB)
   return
}
func funAddB(i int) {
   j := "sasa"
 b := "sasa"
 c := "sasa"
 i = 10
 i = 111
 _, _, _ = c, b ,j
 funAddr(12121)
   //t2 := unsafe.Pointer(&i)
 //println("funAddB", t2)}
func main() {
   funAddB(1)
}

运行结果

bp 0xc000036770
fun 17099834
fun 0x104ec3a
0xc000036760
d 17099792
diff 42
funAddB 0x10715d8

diff是42, 正好是funAddB 函数调用funAddr的汇编代码的差,
所以golang函数调用是栈(sp)会push一个指针,指针指向原函数被调用的位置。


有疑问加站长微信联系(非本文作者)

本文来自:Segmentfault

感谢作者:xxx小M

查看原文:golang函数调用是栈(sp)会push一个指针,查看指针是什么

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:1006366459

95 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传