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

陕西网站建设深圳全网营销网站

陕西网站建设,深圳全网营销网站,公司的英文,咸宁做网站的公司你知道 GO 中什么情况会变量逃逸吗#xff1f;首先我们先来看看什么是变量逃逸 Go 语言将这个以前我们写 C/C 时候需要做的内存规划和分配#xff0c;全部整合到了 GO 的编译器中#xff0c;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: t2go tool compile 工具很明显的调试出来说明 t2 这个变量已经逃逸到 堆上面去了 感兴趣的话还可以利用工具瞅一眼汇编多了解一点也有好处 刚才参数 -m 是直接查看是否逃逸我们可以加 -S 会打印出具体的会变代码查看该变量是否是 new 出来的 # go tool compile -S main.go | grep new 0x0035 00053 (main.go:6) CALL runtime.newobject(SB) rel 544 t8 runtime.newobject0对应的看看代码就是 创建 t2 变量的这一行 对于 go tool compile 工具我们可以通过 help 命令来查看一下 # go tool compile --help欢迎点赞关注收藏 朋友们你的支持和鼓励是我坚持分享提高质量的动力 好了本次就到这里 技术是开放的我们的心态更应是开放的。拥抱变化向阳而生努力向前行。 我是阿兵云原生欢迎点赞关注收藏下次见~
http://www.dnsts.com.cn/news/98660.html

相关文章:

  • 说一说网站建设的含义怎么建设婚恋网站
  • 做网站 需要注意什么网站建设公司内幕
  • 简述建设企业网站可信度的具体策略自己网站可以加标志吗
  • 网站开发用什么语言最好说几个手机可以看的网站
  • 影视公司网站建设番禺做网站平台
  • 上海专业做网站公西安做网站招聘
  • 资源网站微信里的网站怎么做
  • 网站网页设计如何选怎么做网站的图片
  • 政务网站队伍建设情况wordpress生成ios app
  • 网站后台文档哈尔滨模版建站公司推荐
  • 数据开发网站模板优质聊城做网站费用
  • 网站制作公司网站设计公司适合团购报名的网站开发
  • 上海网站建设 知名觉自己做的网站首页变成符号了
  • 云南网站建设的价值xampp wordpress主题
  • 做公司 网站制作个人网站主页
  • 北京网站设计精选柚v米科技wordpress公告栏插件
  • 外贸网站运营推广自己做一款app需要多少钱
  • 支付网站模板配件查询网站制作
  • 当地自己的淘宝网站怎么做直播软件推荐
  • 丰台成都网站建设wordpress 数字排序
  • 金阳龙泉苑网站建设美食的网站建设个人总结
  • 网站网页切换怎么做老房装修改造哪家好
  • 佳木斯做网站的公司西双版纳傣族自治州房价
  • 备案 网站建设计划书国内站长做国外网站
  • 企业静态网站源码一个网站一年的费用
  • 单品电商网站建设遵义网站制作如何收费
  • 文山知名网站建设网站 设计公司 温州
  • 丰台网站开发公司11网拍推广平台
  • 中国商标网商标查询官方网站拼多多电商运营模式
  • 南昌网站设计有限公司网站开发用哪个软件方便