【问题标题】:How much memory is allocated for int8, int16 and int32 in Golang? [duplicate]Golang 中为 int8、int16 和 int32 分配了多少内存? [复制]
【发布时间】:2018-12-08 13:10:44
【问题描述】:

我有一段简单的代码,我为int8int16int32int64 类型分配内存并打印出变量的地址:

package main

import (

"fmt"
"runtime"
)

func main() {

    fmt.Println(runtime.Compiler, runtime.GOARCH, runtime.GOOS)

    var i8 *int8
    var i16 *int16
    var i32 *int32
    var i64 *int64

    fmt.Println(&i8)
    fmt.Println(&i16)
    fmt.Println(&i32)
    fmt.Println(&i64)

}

这是我收到的输出:

gc amd64 darwin
0xc00008a020
0xc00008a028
0xc00008a030
0xc00008a038

从这里我可以得出结论,只有int16 使用了 4 个字节,其他类型使用了 8 个字节。

我的推理和检查分配内存大小的方法是否正确?

如果是,在 64 位架构系统上使用 int8int32 有什么好处?

【问题讨论】:

  • @peterSO 是的,你是对的!将其更改为实际值 - 返回一个更有希望的结果:gc amd64 darwin 0xc000076018 0xc00007601a 0xc00007601c 0xc000076030

标签: go


【解决方案1】:

在您的示例中,您分配的指针都是 8 个字节:gc amd64 darwin

以你的为例,

package main

import (
    "fmt"
    "runtime"
    "unsafe"
)

func main() {

    fmt.Println(runtime.Compiler, runtime.GOARCH, runtime.GOOS)

    var i8 *int8
    var i16 *int16
    var i32 *int32
    var i64 *int64

    fmt.Println(&i8, unsafe.Sizeof(i8), unsafe.Sizeof(*i8))
    fmt.Println(&i16, unsafe.Sizeof(i16), unsafe.Sizeof(*i16))
    fmt.Println(&i32, unsafe.Sizeof(i32), unsafe.Sizeof(*i32))
    fmt.Println(&i64, unsafe.Sizeof(i64), unsafe.Sizeof(*i64))

}

输出:

gc amd64 linux
0xc00000e030 8 1
0xc00000e038 8 2
0xc00000e040 8 4
0xc00000e048 8 8

对于 CPU 操作,使用 CPU 的自然字长通常是最有效的,例如,amd64 上的 intint64

对于内存大小,对于大量整数,使用可以容纳值范围的最小整数大小可能是最有效的。

这是一种平衡行为。对来自真实应用的真实代码进行基准测试。

【讨论】:

    猜你喜欢
    • 2017-01-30
    • 1970-01-01
    • 1970-01-01
    • 2012-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多