• golang 数组的一些自问自答


    所有代码基于Go-1.17。一些研究Go数组的自问自答,可以考虑作为面试题。

    问题:静态存储区是什么?和堆/栈有什么区别?

    回答:

    可以参考下列图

    堆上存放new产生的大块内存

    栈上存放的是程序运行的时候使用的局部变量内存

    代码段和数据段可以统一称为静态存储区

    代码段存放的就是程序的二进制文件

    数据段存放的包含三个部分:

    • 只读数据段
      • 一般是const修饰的变量,不需要修改的
    • 已初始化的读写数据段
      • 已初始化的全局变量
      • 已经初始化的静态局部变量
    • 未初始化段
      • 未初始化的全局变量
      • 未初始化的静态变量

    问题:数组的初始化是在栈上,还是在数据段上的?

    回答:

    如果是非字面量数组类型,会在栈上初始化

    如果是字面量类型:

    当元素少于或者等于4个的时候,会直接将数组元素在栈上初始化

    当元素大于4个的时候,会在数据段初始化,在使用的时候,复制到栈上

    具体可以参考

    cmd/compile/internal/walk/complit.go的 anylit

    问题: 数组的结构是什么样子的?

    数组在内存中是一段连续的内存。

    它的类型为:

    里面存放了Bound,元素个数,和Elem 单个元素的类型。

    问题:go访问数组的下标越界是运行时候发现的还是编译期发现的?

    回答:

    两个阶段都有可能,对于可以静态检测出来的,在编译器就会报错。

    比如代码:

    具体使用的是 cmd/compile/internal/typecheck/expr.go 的 tcIndex 方法

    但是如果是使用变量下标来访问,就只能在运行期间来判断是否越界。通过汇编码大致能看到最后调用panicIndex

    参考

    https://blog.csdn.net/chen1083376511/article/details/54930191

    实时了解作者更多技术文章,技术心得,请关注微信公众号“轩脉刃的刀光剑影”

    本文基于署名-非商业性使用 3.0许可协议发布,欢迎转载,演绎,但是必须保留本文的署名叶剑峰(包含链接http://www.cnblogs.com/yjf512/),且不得用于商业目的。如您有任何疑问或者授权方面的协商,请与我联系

  • 相关阅读:
    IOS开发系列之阿堂教程:玩转IPhone客户端和Web服务端交互(客户端)实践
    详解基于linux环境MySQL搭建与卸载
    详解Redis基本命令
    浅谈基于Linux的Redis环境搭建
    浅谈Linux基本命令
    浅谈基于Intellij IDEA Maven的配置与使用
    浅谈SpringMVC执行过程
    浅析关于java的一些基础问题(上篇)
    软件架构应关心的若干要素
    详解mybatis映射配置文件
  • 原文地址:https://www.cnblogs.com/yjf512/p/15735278.html
Copyright © 2020-2023  润新知