我有一段简单的代码,我在其中为int8
,int16
,int32
和int64
类型分配内存并打印出变量的地址:>
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位体系结构系统上使用int8
,int32
有什么好处?
答案 0 :(得分:4)
您正在分配的指针在示例中全为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
上的int64
或amd64
。
对于内存大小,对于大量整数,使用可以容纳值范围的最小整数大小可能是最有效的。
这是一种平衡行为。从真实应用程序中对真实代码进行基准测试。