GoLang - 内存分配 - []byte 与 string

2024-02-25

在下面的代码中:

c := "fool"
d := []byte("fool")
fmt.Printf("c: %T, %d\n", c, unsafe.Sizeof(c)) // 16 bytes
fmt.Printf("d: %T, %d\n", d, unsafe.Sizeof(d)) // 24 bytes

为了确定从 CloudFoundry 接收 JSON 数据所需的数据类型,我测试了上面的示例代码以了解以下内容的内存分配:[]byte vs string type.


预计尺寸为string类型变量c是 1 字节 x 4 ascii 编码字母 = 4 字节,但大小显示为 16 字节。

For byte类型变量d, GO 将字符串作为字符串文字嵌入到可执行程序中。它在运行时使用以下命令将字符串文字转换为字节切片runtime.stringtoslicebyte功能。就像是...[]byte{102, 111, 111, 108}

预计尺寸为byte类型变量d又是 1 个字节 x 4 个 ascii 值 = 4 个字节,但是变量的大小d显示 24 字节作为其基础数组容量。


为什么两个变量的大小都不是 4 个字节?


Go 中的切片和字符串都是类似结构体的头:

reflect.SliceHeader https://golang.org/pkg/reflect/#SliceHeader:

type SliceHeader struct {
        Data uintptr
        Len  int
        Cap  int
}

reflect.StringHeader https://golang.org/pkg/reflect/#StringHeader:

type StringHeader struct {
        Data uintptr
        Len  int
}

报告的尺寸unsafe.Sizeof() https://golang.org/pkg/unsafe/#Sizeof是这些标头的大小,不包括指向数组的大小:

Sizeof 接受任何类型的表达式 x 并返回假设变量 v 的大小(以字节为单位),就好像 v 是通过 var v = x 声明的一样。该大小不包括 x 可能引用的任何内存。例如,如果 x 是切片,则 Sizeof 返回切片描述符的大小,而不是切片引用的内存的大小。

要获取某个任意值的实际(“递归”)大小,请使用 Go 的内置测试和基准测试框架。详细信息请参见Go中如何获取变量的内存大小? https://stackoverflow.com/questions/44257522/how-to-get-memory-size-of-variable-in-golang/44258164#44258164

对于具体的字符串,请参见Golang 中字符串内存使用情况 https://stackoverflow.com/questions/52851788/string-memory-usage-in-golang/52851967#52851967。所需的完整内存string值可以这样计算:

var str string = "some string"

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

GoLang - 内存分配 - []byte 与 string 的相关文章

随机推荐

  • 数据字段中包含 SSD AID 的删除 APDU 命令,返回 6985

    我有一个包含 SSD 补充安全域 的 Javacard 我想删除它 通常 当我想从卡中删除小程序或包时 我会发送以下内容删除 APDU成功后命令相互认证过程 不需要 MAC 或数据字段加密 并且Security Level 0就足够了删除
  • 如何测试具有私有方法、字段或内部类的类?

    如何使用 JUnit 测试具有内部私有方法 字段或嵌套类的类 为了能够运行测试而更改方法的访问修饰符似乎很糟糕 如果你有一些遗产Java应用程序 并且您不允许更改方法的可见性 测试私有方法的最佳方法是使用反射 http en wikiped
  • UIToolBar 中的 UISegmentedControl

    我知道如何添加UISegmentedControl to a UIToolBar来自 IB 内部 但我尝试以编程方式执行相同的操作 因为我正在使用 的自定义子类UISegmentedControlwith 没有 XIB 这是代码UISegm
  • Haskell 中 ++ 和 : 有什么区别?

    我不明白这个 Prelude gt hi there hithere Prelude gt hi there
  • python循环创建我知道它很简单但我不知道出了什么问题[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 python 新手尝试创建 while 循环来打印 1 到 10 而不仅仅是 10 I 0 while I 10 I 1 prin
  • 需要帮助在 Python 中添加循环来重新启动程序

    到目前为止 这就是我所得到的 import random answer1 Absolutely answer2 No way Pedro answer3 Go for it tiger answer4 There s different w
  • ASP.NET MVC 样式验证错误?

    ASP NET MVC 的验证错误可以设置样式吗 在哪里 我尝试在 Site css 中编辑 input validation error 类 但这没有任何效果 pom 如果你的风格 field validation error那么这将更改
  • IL 中的 if 是什么样的?

    一个是什么意思if语句编译成 IL 后是什么样子 这是 C 中非常简单的构造 有人能给我一个更抽象的定义吗 这里有一些if语句以及它们如何转换为 IL ldc i4 s 0x2f var i 47 stloc 0 ldloc 0 if i
  • 如何将录制的视频保存到相册中?

    以下代码是将相机拍摄的图像保存到相册中 if mediaType isEqualToString NSString kUTTypeImage image info objectForKey UIImagePickerControllerEd
  • 为什么 Kotlin lang 只允许项目中只有一个 main 函数?

    这是否剥夺了 java 中具有多个主入口点的特性 这些入口点可以在需要时调用 UPDATE Kotlin 的最新版本允许多个main即使在同一个包中也可以运行 如果它们位于不同的文件中 项目中可以有多个主函数 但每个主函数只能有一个pack
  • 纯 CSS 使字体大小根据动态字符数量进行响应

    我知道用 Javascript 可以很容易地解决这个问题 但我只对纯 CSS 解决方案感兴趣 我想要一种动态调整文本大小的方法 以便它始终适合固定的 div 这是示例标记 div style width 200px height 1em p
  • JavaScript 跨浏览器:将字符串视为数组是否安全?

    这段代码在所有主流浏览器中都安全吗 var string 123 alert string 1 2 should alert true 不 这不安全 Internet Explorer 7 不支持按索引访问字符串 你必须使用charAt兼容
  • 如何在 swiftui 中添加自定义圆形滑动操作?

    在我的 SwiftUI 应用程序中 我想在 ListView 中设计圆形滑动操作 如以下示例所示 天气应用程序 iOS 15 我知道您可以添加这样的自定义操作 List Text Pepperoni pizza swipeActions B
  • PHP 或 MySQL 中的业务逻辑?

    在具有合理流量的网站上 如果将应用程序 业务逻辑编写为存储过程 触发器和视图 而不是编写在 PHP 代码本身中 这会重要吗 牢记可扩展性的最佳方法是什么 我无法向您提供统计数据 但除非您计划将来将 PHP 更改为另一种语言 否则我可以说将业
  • 使用 graph api 2.2 从 android 中的 facebook sdk 4.0.1 获取好友列表

    我在进行一些搜索后用于获取列表的代码如下 GraphRequestBatch batch new GraphRequestBatch GraphRequest newMyFriendsRequest accessToken new Grap
  • pg_dump 忽略表顺序?

    我最近一直在玩 PostgreSQL 并且无法理解如何备份和恢复单个表 我使用 pgadmin3 备份数据库中的单个表 以便将其复制到不同的服务器 当我尝试对文件执行 pg restore 时 收到错误消息 指出该序列不存在 pg rest
  • XmlHttpRequest.onload 未调用

    我正在玩这个XmlHttpRequest事物 在一些教程和书籍中 它是onload请求完成时调用的函数 在我的小实验中 这个函数从未被调用 这是我的代码 window onload function var url http www goo
  • 渐变剪切似乎在“无”上窒息

    我正在尝试向我的图表添加渐变裁剪 我使用了这里推荐的方法 如何在tensorflow中有效应用梯度裁剪 https stackoverflow com questions 36498127 how to effectively apply
  • Django 官方教程第 1 部分:运行时错误:cmp 中超出最大递归深度

    根据 django 教程 我创建了项目并执行了manage py runserver 如教程中所述 并且我收到错误 RuntimeError cmp 中超出了最大递归深度 有什么办法可以纠正这个问题吗 我得到这个错误 Validating
  • GoLang - 内存分配 - []byte 与 string

    在下面的代码中 c fool d byte fool fmt Printf c T d n c unsafe Sizeof c 16 bytes fmt Printf d T d n d unsafe Sizeof d 24 bytes 为