为什么空切片有 24 个字节?

2024-04-30

我想了解创建空切片时会发生什么make([]int, 0)。我执行此代码进行测试:

emptySlice := make([]int, 0)
fmt.Println(len(emptySlice))
fmt.Println(cap(emptySlice))
fmt.Println(unsafe.Sizeof(emptySlice))

size和capacity返回很明显,都是0,但是slice的大小是24字节,为什么呢?

24字节应该是3int64正确的? 24 字节切片的一个内部数组应该类似于:[3]int{},那么为什么一个空切片有 24 个字节呢?


如果您阅读了文档 https://golang.org/pkg/unsafe/#Sizeof for unsafe.Sizeof,它解释了这里发生的事情:

该大小不包括 x 可能引用的任何内存。例如,如果 x 是一个切片,则 Sizeof 返回该切片的大小切片描述符,而不是切片引用的内存的大小。

Go 中的所有数据类型都是静态大小的。尽管切片具有动态数量的元素,但这不能反映在数据类型的大小中,因为那样它就不是静态的。

“切片描述符”,顾名思义,是描述切片的所有数据。这就是切片变量中实际存储的内容。

Go 中的切片有 3 个属性:底层数组(内存地址)、切片长度(内存偏移量)和切片容量(内存偏移量)。在 64 位应用程序中,内存地址和偏移量往往以 64 位(8 字节)值存储。这就是为什么您看到的大小为 24 (= 3 * 8 ) 字节。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么空切片有 24 个字节? 的相关文章

随机推荐

  • 初始化列表中的依赖关系

    这种行为定义明确吗 class Foo int A B public Foo int Bar B Bar A B 123 int main Foo MyFoo 0 return 0 不 它是未定义的 A将首先初始化 它是类定义中的第一个 并
  • 博客的 mongodb 架构设计

    您将如何为具有基于文档的数据库 mongodb 的类似博客的网站设计架构 该站点具有以下对象 用户 文章 评论 用户可以向文章添加评论 每个用户还可以为每个评论投票一次 我希望能够有效地执行这些查询 1 获取文章A 文章A的评论以及每个评论
  • 从 R 中的选项卡式文本创建树形图

    我想制作以下数据的树 流程图 并用制表符正确缩进 Vertebrates fish goldfish clownfish amphibian frog toad reptiles snake lizard turtle tortoise b
  • python kivy在矩形内添加文本

    如何在矩形内添加文本 我使用下面的代码并在画布内添加了一个标签 希望它能显示在矩形内 import kivy from kivy app import App from kivy uix anchorlayout import Anchor
  • 如何编写看起来像方法的 lambda 表达式?

    我一直在疯狂地试图解决这个问题 考虑以下代码 我假设已定义前向引用 Signature representing a pointer to a method call typedef void MyClass MyMethod int cl
  • Spark超时可能是由于HDFS中文件超过100万个的binary Files()

    我正在通过以下方式读取数百万个 xml 文件 val xmls sc binaryFiles xmlDir 该操作在本地运行良好 但在纱线上失败并显示 client token N A diagnostics Application app
  • 显示错误后如何隐藏错误提供程序?

    我有一个问题 也许有人可以帮助我 你知道在这个程序中制作的错误被删除后 如果没有更多错误 图标 错误提供程序 消失 但它出现了 该怎么办 请原谅我的语法错误 bool IsValidated true will be checked on
  • 如何让 Android 设备启动并跳过屏幕锁定

    如题 我可以唤醒手机并跳过屏幕锁定吗 我想编写一个基于闹钟的应用程序 当时间到了时 即使手机处于睡眠状态 该应用程序也应该检测到后台的某些内容 当检测到某些东西时 手机应该自动唤醒 跳过屏幕锁定 并显示图片 开始新的活动 有人能给我一些关于
  • jQuery UI 对话框始终位于右上角

    我试图将对话框放置在锚标记的右侧 但没有成功 我检查了解决方案jQuery UI 对话框定位 https stackoverflow com questions 744554 jquery ui dialog positioning似乎都不
  • 如何在eclipse中生成java项目的可执行文件[重复]

    这个问题在这里已经有答案了 我正在尝试为我的 Java 应用程序创建一个可执行文件 但我不知道该怎么做 我知道如何生成可执行 jar 文件 但我想制作一个可执行应用程序 我正在使用 eclipse indigo 来制作 java 应用程序并
  • 在 PHP 中生成 SAN CSR

    我目前正在编写一个脚本 通过 Web 界面生成 CSR 以便提交以生成证书 我当前的问题是我想生成 SAN 证书 但找不到有关如何添加subjectAlternateName到生成的证书请求中 我当前的代码是 private key ope
  • 更改提交按钮行为的更合适的方法[重复]

    这个问题在这里已经有答案了 是的 我以前问过这个here https stackoverflow com questions 62268305 whitespace in wrapped form element但没有一个答案是合适的 或者
  • 在 LaTeX Beamer 中更改 \textbullet 的颜色

    我不想使用 Beamer 的标准蓝色主题 我想用beaver 这是深红色 一切看起来都不错 除了如果我使用itemize要点仍然是蓝色的 有没有一种好方法可以让项目符号随我使用的颜色主题而变化 如果我选择淡黄色主题 我希望子弹也会变成黄色
  • 无法通过在 C# 中调用 powershell 安装 NuGet 提供程序

    我从下面的 C 方法调用 powershell cmdlet 它在 Install Module Name CosmosDb 行失败 并出现以下错误 使用 2 个参数调用 ShouldContinue 时出现异常 一个命令 提示用户失败 因
  • 扩展 EditText 以赋予其额外的“默认”功能的正确方法是什么

    我想知道是否可以向 EditText 添加功能 以便当我在布局 xml 中包含新扩展的字段时 我不必向 Activity 类添加任何代码以使其以特定方式运行 例如 我想创建一个 EditPhone 字段 它只是一个 EditText 它具有
  • React:如何组合Material-UI中标记的多种样式

    我有两种风格 一件事包含在特定组件中 另一件事包含在全局组件中 例如 假设我们有以下树 index tsx App tsx globalConstants ts 在 globalConstants ts 中 import Theme mak
  • 如何在vs2008中使用C#使用卷影复制

    我想制作一个使用卷影复制服务进行备份 恢复的 C 应用程序 如何从 C 访问 VSS API 查看AlphaVSS https github com alphaleonis AlphaVSS 我相信这正是医生所吩咐的
  • 在 Ruby 中,有没有办法轻松删除数组中的 1 个匹配项?

    在 Ruby 中 数组减法或reject gt gt 1 3 5 7 7 7 gt 1 3 5 gt gt 1 3 5 7 7 reject i i 7 gt 1 3 5 将删除数组中的所有条目 是否有一种方法可以轻松删除仅出现 1 次的情
  • 在客户端处理模式下使用 jQuery DataTables 对字母数字数据进行排序

    所以我有一个包含字母数字值的表 例如 8980 1100 A1100 BA200 我希望它首先以数字顺序方式对其进行排序 然后以字母数字方式进行排序 例如 1000 8980 A1100 BA200 在这里找到了一些帮助 但不完全是我正在寻
  • 为什么空切片有 24 个字节?

    我想了解创建空切片时会发生什么make int 0 我执行此代码进行测试 emptySlice make int 0 fmt Println len emptySlice fmt Println cap emptySlice fmt Pri