为了账号安全,请及时绑定邮箱和手机立即绑定

Golang中int8、int16、int32分别分配了多少内存?

Golang中int8、int16、int32分别分配了多少内存?

Go
守着星空守着你 2023-05-15 14:50:46
我有一段简单的代码,我在其中为int8、int16和类型分配内存并打印出变量的地址:int32int64package mainimport ("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 darwin0xc00008a0200xc00008a0280xc00008a0300xc00008a038从这里我可以得出结论,只有int16使用 4 个字节,其他类型使用 8 个字节。我的推理和检查分配的内存大小的方法是否正确?如果是,在 64 位架构系统上使用int8,有什么优势?int32
查看完整描述

1 回答

?
30秒到达战场

TA贡献1828条经验 获得超6个赞

您分配的指针在您的示例中都是 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 的自然字长通常是最有效的,例如,int或int64on amd64。


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


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


查看完整回答
反对 回复 2023-05-15
  • 1 回答
  • 0 关注
  • 153 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信