当前位置: 首页 > news >正文

东莞网站建设公司专业竞价托管哪家好

东莞网站建设公司,专业竞价托管哪家好,泰国浪琴手表网站,天津网站建设哪家好你知道 GO 中什么情况会变量逃逸吗?首先我们先来看看什么是变量逃逸 Go 语言将这个以前我们写 C/C 时候需要做的内存规划和分配,全部整合到了 GO 的编译器中,GO 中将这个称为 变量逃逸 GO 通过编译器分析代码的特征和代码的生命周期&#x…

你知道 GO 中什么情况会变量逃逸吗?首先我们先来看看什么是变量逃逸

Go 语言将这个以前我们写 C/C++ 时候需要做的内存规划和分配,全部整合到了 GO 的编译器中,GO 中将这个称为 变量逃逸

GO 通过编译器分析代码的特征和代码的生命周期,决定应该使用堆还是栈来进行内存分配

C 代码 和 GO 代码对比哪个会崩溃?

咱们写一个简单的例子,在 C 里面内存分配到栈上面还是堆上面是一个很明确的事情

例如

函数中的变量是分配在栈上面,会随着该函数调用完毕后随之销毁掉

程序员自己 malloc 开辟的内存是在堆上面,需要程序员自己去释放

那么问题来了:

如果我们将某一个函数中的局部变量的地址(全篇以局部变量为例),作为该函数的返回值,最终在函数外部去访问这个局部变量的地址,是否会出错呢?一起来看看吧

C 程序

test.c

int * get_res(int num){int tmp = num + 10;return &tmp;
}int main(){int * res = get_res(80);printf("%d  -- %p\n" , *res, res);
}

上面写了一个简单的 C 代码,获取传入数据并 + 10 得到的结果

# gcc test.c  -o test
test.c: In function ‘get_res’:
test.c:7:12: warning: function returns address of local variable [-Wreturn-local-addr]return &tmp;^~~~
# ./test
Segmentation fault

这里可以看出编译程序,报了 warning 了,不过不影响程序的编译 , 这个 warning 报错信息是 因为我们返回了临时变量的地址,C 编译器检测到了,给我们抛出了一个 warning

执行编译的程序后,崩溃了 , 熟悉 C 的小伙伴一点都不惊慌,他们不会写出这种代码

出现 段错误 的原因很明显,上面有说到,是因为外部访问了局部变量的地址,外部访问的时候,此时这个局部变量已经被销毁了,此时外部访问的这个指针,属于野指针,因此出现程序崩溃

GO 程序

go 程序的逻辑和上面 C 程序的逻辑一模一样,那么我们看看是否会出现程序崩溃呢

func getRes(num int) *int {tmp := num + 10return &tmp
}
func main() {res := getRes(80)fmt.Printf("%d  -- %p\n", *res, res)
}

执行上述代码,查看效果

# go run main.go
90  -- 0xc420018078

熟悉 go 语言的 小伙伴看到这里心中也毫无波澜,程序正常执行,没有崩溃,因为他们知道原因,这个现象属于 变量逃逸

那么我们一起来看看 GO 为什么会这样做,是如何做的呢?

GO 的逃逸是啥样子的?

上面有说到 GO 不会像 C/C++ 一样需要程序员自己去关心内存分配,是期望 GO 程序员更多的关注逻辑

因此内存分配这一块,GO 编译器都做的妥妥的,一个变量是分配在栈上面还是堆上面,不是简单的看一个变量是局部变量就分配到栈上,这个是根据具体的使用的,有时候它也会被分配到堆上面

当我们发现本应该分配在栈上面的变量,却分配在堆上面了,说明发生了逃逸

开始探究和验证

我们可以尝试写一个简单的 demo ,还是将局部变量的地址返回到外部去,外部来访问这个局部变量的地址

func getRes(tmp int) *int {var t1 int = 1var t2 int = 2var t3 int = 3println(&tmp, &t1, &t2, &t3)return &t2
}func main() {res := getRes(80)println(*res, res)
}

执行上述代码查看效果

# go run main.go
0xc420045f50 0xc420045f68 0xc420045f60 0xc420045f58
2 0xc420045f60

通过上面的将变量地址打印出来貌似没有看出上面端倪,地址是也是连续的

那么我们使用 go 提供的工具来看看这个程序是不是存在逃逸

执行 # go tool compile -m main.go 查看效果如下

main.go:11:9: &t2 escapes to heap
main.go:6:6: moved to heap: t2

go tool compile 工具很明显的调试出来说明 t2 这个变量已经逃逸到 堆上面去了

感兴趣的话还可以利用工具瞅一眼汇编,多了解一点也有好处

刚才参数 -m 是直接查看是否逃逸,我们可以加 -S 会打印出具体的会变代码,查看该变量是否是 new 出来的

# go tool compile -S main.go | grep new
0x0035 00053 (main.go:6)        CALL    runtime.newobject(SB)
rel 54+4 t=8 runtime.newobject+0

对应的看看代码,就是 创建 t2 变量的这一行

对于 go tool compile 工具,我们可以通过 help 命令来查看一下

# go tool compile --help

欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

好了,本次就到这里

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是阿兵云原生,欢迎点赞关注收藏,下次见~

http://www.yidumall.com/news/26884.html

相关文章:

  • 建设银行 钓鱼网站教育培训机构前十名
  • 做曖視頻网站怎么优化网站排名
  • 专业企业网站建设公司佛山百度快速排名优化
  • 怎么做军事小视频网站广州新一期lpr
  • 网站域名到期怎么办优化营商环境个人心得
  • 哪个网站可以做投资回测2021拉新推广佣金排行榜
  • 临沂建设网站搭建一个网站的流程
  • 很有质感的网站百度手机下载安装
  • 北京互联网企业有哪些google搜索优化
  • 网站网址前的小图标怎么做的营销推广seo
  • ps培训班要学多久多少钱北京seo优化wyhseo
  • 17网站一起做网店 发货慢seo辅助工具
  • 上海网站建设领导品牌厦门网站seo哪家好
  • 高端的网站设计公司搜索引擎优化工具
  • 中山网站制作定制网站维护的主要内容
  • 十大电子游戏平台网站广州网站快速优化排名
  • 牛商网 做的p2p网站旺道seo推广系统怎么收费
  • 高端建站下载百度2023最新版
  • 个人做网站全球网站排名前100
  • 怎么建自己的手机网站关键词一般是指什么
  • 德州建设网站公司百度售后电话人工服务
  • 怎么添加wordpress模板文件夹搜索引擎优化答案
  • 彩票网站开发系统如何搭建seo网络推广优势
  • 响应式网站建设服务提供商百度推广账号怎么申请
  • 怎么做公司网站文案网站安全检测在线
  • 精品课网站制作seo推广公司招商
  • 常州企业建站系统关键信息基础设施安全保护条例
  • 沙湾移动网站建设全网关键词搜索工具
  • 网站制作排版网站推广如何做
  • 做搜狗手机网站点泰安百度推广代理