设为首页 加入收藏

TOP

高性能go服务之高效内存分配(四)
2019-09-03 03:39:54 】 浏览:130
Tags:高性能 服务 高效 内存 分配
引用的数据移动到堆上。这里发生了什么?

func noescape(p unsafe.Pointer) unsafe.Pointer {
    x := uintptr(p)
    return unsafe.Pointer(x ^ 0) } 

noescape()方法掩盖了输入参数和返回值直接的依赖关系。编译器不认为p会通过x逃逸,因为uintptr()会产生一个对编译器不透明的引用。内置的uintptr类型的名称会让人相信它是一个真正的指针类型,但是从编译器的视角来看,它只是一个恰好大到足以存储指针的整数。最后一行代码构造并返回了一个看似任意整数的unsafe.Pointer值。

一定要清楚,我们并不推荐使用这种技术。这也是为什么它引用的包叫做unsafe,并且注释里写着USE CAREFULLY!

总结

我们来总结一下关键点:

  1. 不要过早优化!使用数据来驱动优化工作
  2. 栈分配廉价,堆分配昂贵
  3. 了解逃逸分析的规则能够让我们写出更高效的代码
  4. 使用指针几乎不会在栈上分配
  5. 性能关键的代码段中寻找提供分配控制的API
  6. 在热代码路径里谨慎地使用接口类型
首页 上一页 1 2 3 4 下一页 尾页 4/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇prisma反向代理 下一篇GO指南练习:切片

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目