专栏首页容器计算Go语言函数间传递数组的问题

Go语言函数间传递数组的问题

大家都知道,Go 语言中,数组是分配连续内存的,也就是说,在函数中传递一个大数组,代价是很高的,例如:

// 声明了一个8 MB 的数组
// 8 * 10^8 = 8 * 100000000 Bit
array := [1e6]int

// 将入有个 foo() 函数
foo(array)

这样的话,每次调用 foo() 函数的时候,都会在栈上分配8 MB 的内存,因为函数之间传递变量时,是值传递的,也就是不管这个变量的数组有多大,都会完整复制,然后传递给函数。

这就是为什么有时候会见到一个函数可以接受一个指针类型的参数。如下:

// 声明了一个8 MB 的数组
// 8 * 10^8 = 8 * 100000000 Bit
array := [1e6]int

// 将入有个 foo() 函数
foo(&array)

这样的开销就小得多了,因为这个参数其实是将数组的地址传入了函数,而不是数组本身的值,而一个内存地址,只需要在展示栈上分配8个字节就够用了。

但是,这样也会带来另外一种风险,就是当你修改了这个指针指向的值,那么由于共享内存,传入这个函数的指针指向的值,也会被改变。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Apache Beam的Docker Demo

    Apache Beam 是统一的批/流数据处理的编程模型。本文主要是参考官方文档,用 Docker 来快速跑起来一个用 Beam 来构建的 Flink 程序来处...

    runzhliu
  • Go语言函数间传递切片的问题

    Go 语言函数间传递切片,也是在函数间以值传递的方式进行的,由于切片的大小比较小,在函数间复制和传递的成本是比较低的。

    runzhliu
  • Apache Atlas系列 -- 部署

    摘抄一段官网上的介绍,Atlas 是一个可伸缩且功能丰富的数据管理系统,深度集成了 Hadoop 大数据组件。简单理解就是一个跟 Hadoop 关系紧密的,可以...

    runzhliu
  • PHP字符串和数组操作函数

    str_split() 函数把字符串分割到数组中。 stripslashes() 函数删除由 addslashes() 函数添加的反斜杠。 stripcslas...

    wangxl
  • Array数组函数(三)

    array_keys — 返回数组中所有的键名 array_values — 返回数组中所有的值 array_key_exists — 检查给定的键名或索引是否...

    wangxl
  • python实现支持向量机之软间隔(理论三)

    上一节所讲的支持向量机是在数据线性可分的情况下的,当数据线性不可分时,也就是并不是所有数据都满足:

    绝命生
  • 一个小技巧提升 OkHttp 请求稳定性

    OkHttp是可以说是Android开发中,每个项目都必需依赖的网络库,我们可以很便捷高效的处理网络请求,极大的提升了编码效率。但是有时候,我们使用OkHttp...

    技术小黑屋
  • 由Logistic Regression所联想到的...

    很久之前就想写一篇围绕Logistic Regression(LR)模型展开的文章了,碍于时间、精力以及能力有限,时至今日才提笔构思。希望此文能够帮助初学者建立...

    张小磊
  • JavaScript 函数作用域和块作用域不完全指北

    我们在 JavaScript 词法作用域不完全指北 中介绍了词法作用域,词法作用域是由你写代码时将变量和块作用域写在哪里来决定的,词法分析器处理代码时会保持作用...

    撸码那些事
  • Java开发环境系列:全文搜索引擎elasticsearch(ik分词器)

    安装中文分词插件,在elasticsearch-6.2.2\bin目录下执行以下命令: 

    架构师小跟班

扫码关注云+社区

领取腾讯云代金券