drema2014 2019-04-29 13:42
浏览 495
已采纳

GoLang-内存分配-[]字节与字符串

In the below code:

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

To decide the datatype needed to receive JSON data from CloudFoundry, am testing above sample code to understand the memory allocation for []byte vs string type.


Expected size of string type variable c is 1 byte x 4 ascii encoded letter = 4 bytes, but the size shows 16 bytes.

For byte type variable d, GO embeds the string in the executable program as a string literal. It converts the string literal to a byte slice at runtime using the runtime.stringtoslicebyte function. Something like... []byte{102, 111, 111, 108}

Expected size of byte type variable d is again 1 byte x 4 ascii values = 4 bytes but the size of variable d shows 24 bytes as it's underlying array capacity.


Why the size of both variables is not 4 bytes?

  • 写回答

1条回答 默认 最新

  • dousonghs58612 2019-04-29 13:56
    关注

    Both slices and strings in Go are struct-like headers:

    reflect.SliceHeader:

    type SliceHeader struct {
            Data uintptr
            Len  int
            Cap  int
    }
    

    reflect.StringHeader:

    type StringHeader struct {
            Data uintptr
            Len  int
    }
    

    The sizes reported by unsafe.Sizeof() are the sizes of these headers, exluding the size of the pointed arrays:

    Sizeof takes an expression x of any type and returns the size in bytes of a hypothetical variable v as if v was declared via var v = x. The size does not include any memory possibly referenced by x. For instance, if x is a slice, Sizeof returns the size of the slice descriptor, not the size of the memory referenced by the slice.

    To get the actual ("recursive") size of some arbitrary value, use Go's builtin testing and benchmarking framework. For details, see How to get memory size of variable in Golang?

    For strings specifically, see String memory usage in Golang. The complete memory required by a string value can be computed like this:

    var str string = "some string"
    
    stringSize := len(str) + unsafe.Sizeof(str)
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 javaweb项目无法正常跳转
  • ¥15 VMBox虚拟机无法访问
  • ¥15 skd显示找不到头文件
  • ¥15 机器视觉中图片中长度与真实长度的关系
  • ¥15 fastreport table 怎么只让每页的最下面和最顶部有横线
  • ¥15 R语言卸载之后无法重装,显示电脑存在下载某些较大二进制文件行为,怎么办
  • ¥15 java 的protected权限 ,问题在注释里
  • ¥15 这个是哪里有问题啊?
  • ¥15 关于#vue.js#的问题:修改用户信息功能图片无法回显,数据库中只存了一张图片(相关搜索:字符串)
  • ¥15 texstudio的问题,