登录
首页 >  Golang >  Go问答

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

来源:stackoverflow

时间:2024-03-17 13:18:29 383浏览 收藏

在 Go 语言中,整数类型分配的内存大小取决于系统架构。在 64 位系统上,int8、int32 和 int64 分配 8 个字节,而 int16 分配 4 个字节。这种差异的原因是,在 64 位系统上,指针本身占据 8 个字节。通过使用 unsafe 包,可以查看指针的大小和所指向的值的大小。在 64 位系统上,使用与 CPU 自然字大小相匹配的整数类型(如 int 或 int64)通常最有效,而对于内存大小,使用最小的可以容纳值范围的整数类型可能最有效。最终,最佳选择取决于具体应用程序的基准测试结果。

问题内容

我有一段简单的代码,为 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 有何优势?


解决方案


您正在分配示例中全部 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 的自然字大小通常是最有效的,例如 intint64 on amd64

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

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

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《Golang中int8、int16、int32分配了多少内存?》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>