Go中等效的sizeof(aType)

时间:2014-02-02 13:29:59

标签: c++ types go size sizeof

C ++和其他几种语言都有一个名为sizeof(int)的函数(或者你需要的任何类型),它返回当前系统中特定数据类型消耗的字节数。

Go中是否有相同的功能?它是什么?

4 个答案:

答案 0 :(得分:9)

go中的sizeof相当于unsafe.Sizeof。它与C中的sizeof之间的一个区别在于它仅在值上定义(而在C中,它适用于值和类型)。另一个主要区别在于,它几乎不需要,而在C中则相当常见。

一个例子是:

package main

import (
    "fmt"
    "unsafe"
)

func main() {
    fmt.Println(unsafe.Sizeof(int(0)))
}

答案 1 :(得分:6)

如果要查找特定值的大小,有两种方法可以做到这一点 - 使用不安全的软件包或使用反射软件包。以下代码演示了两者:

package main

import (
    "fmt"
    "reflect"
    "unsafe"
)

func main() {
    var i int
    fmt.Printf("Size of var (reflect.TypeOf.Size): %d\n", reflect.TypeOf(i).Size())
    fmt.Printf("Size of var (unsafe.Sizeof): %d\n", unsafe.Sizeof(i))
}

但是,我不知道如何直接获取类型的大小。但我认为你会发现像C一样经常不需要sizeof函数。

答案 2 :(得分:6)

如果您只想查找intuint的尺寸,请使用strconv.IntSize

  

Package strconv

     

Constants

const IntSize = intSize
     

IntSizeintuint值的大小。

例如,

package main

import (
    "fmt"
    "runtime"
    "strconv"
)

func main() {
    fmt.Println(runtime.Compiler, runtime.GOARCH, runtime.GOOS)
    fmt.Println(strconv.IntSize)
}

输出:

gc amd64 linux
64

答案 3 :(得分:2)

不是答案,而是原始问题之后评论主题的延续......

为了实现内存数据集,我会采用以下方法之一:

  • (简单明了):只使用interface{}数组来存储行。

    接口类型的每个值都是两个指针的元组:指向封闭值的实际类型的指针和值本身。实现是gc(和gccgo,我相信)是足够智能的,如果它的大小≤目标平台上uintptr类型的大小,则直接将值存储在该指针空间中。

  • (据称更高级):在单独的数据结构(数组或切片)中存储列的类型信息;可以使用reflect包中的工具获取类型信息。然后将实际数据存储在unsafe.Pointer数组的行中,并使用gc中的接口实现与使用/ unsafe.Pointer类型转换的值相同的技巧。

    这样可以通过不存储值的类型以及每个包含的值来提高空间效率。如果有的话,不确定真正的性能优势。