Memory management 如何获取变量的内存大小?
有人知道如何获取变量的内存大小(Memory management 如何获取变量的内存大小?,memory-management,go,runtime,Memory Management,Go,Runtime,有人知道如何获取变量的内存大小(int、string、[]struct等)并将其打印出来吗?可能吗 var i int = 1 //I want to get something like this: fmt.Println("Size of i is: %?", i) //Also, it would be nice if I could store the value into a string 您可以使用或执行此操作。您可以使用此功能执行此操作。 它返回以字节为单位的大小,由传递给它的值
int
、string
、[]struct
等)并将其打印出来吗?可能吗
var i int = 1
//I want to get something like this:
fmt.Println("Size of i is: %?", i)
//Also, it would be nice if I could store the value into a string
您可以使用或执行此操作。您可以使用此功能执行此操作。
它返回以字节为单位的大小,由传递给它的值占用。
这是:
请注意,一些平台明确禁止使用不安全的,因为它是。。嗯,不安全。这曾经包括AppEngine。不确定今天是否仍然如此,但我想是这样
正如@Timur Fayzrakhmanov所指出的,
reflect.TypeOf(variable.Size()
将为您提供相同的信息。对于反射
包,与不安全
包的限制相同。例如:某些平台可能不允许使用它。变量的大小可以通过使用unsafe.Sizeof(a)
来确定。给定类型(即int
、int64
、string
、struct
等)的结果将保持不变,而不管其值如何。但是,对于类型string
,您可能对变量引用的字符串的大小感兴趣,这是通过对给定字符串使用len(a)
函数确定的。以下代码段说明了字符串类型的变量的大小始终为8,但变量引用的字符串长度可能会有所不同:
package main
import "fmt"
import "unsafe"
func main() {
s1 := "foo"
s2 := "foobar"
fmt.Printf("s1 size: %T, %d\n", s1, unsafe.Sizeof(s1))
fmt.Printf("s2 size: %T, %d\n", s2, unsafe.Sizeof(s2))
fmt.Printf("s1 len: %T, %d\n", s1, len(s1))
fmt.Printf("s2 len: %T, %d\n", s2, len(s2))
}
输出:
s1 size: string, 8
s2 size: string, 8
s1 len: string, 3
s2 len: string, 6
问题的最后一部分是关于将长度(即int
值)分配给字符串
。这可以通过s:=strconv.Itoa(i)
实现,其中i
是一个int
变量,函数返回的字符串被分配给s
注意:转换函数的名称可能是Integer到ASCII的缩写形式。大多数Golang程序员可能会将函数名误读为不安全的。Iota
。Sizeof()是正确的解决方案
var i int
var u uint
var up uintptr
fmt.Printf("i Type:%T Size:%d\n", i, unsafe.Sizeof(i))
fmt.Printf("u Type:%T Size:%d\n", u, unsafe.Sizeof(u))
fmt.Printf("up Type:%T Size:%d\n", up, unsafe.Sizeof(up))
int、uint和uintptr类型在32位系统上通常为32位宽,在64位系统上通常为64位宽。当您需要整数值时,应使用int,除非您有特定原因使用大小或无符号整数类型。我编写了一个包,用于计算变量在运行时消耗的实际内存大小:
功能单一,基本用途为:
fmt.Println(size.Of(varName))
“字符串类型变量的大小始终为8”。否,字符串描述符的大小为8或16字节。例如,s1 size:string,16
和s2 size:string,16
“大多数Golang程序员可能会将函数名[strconv.Itoa
]误读为Iota
“不太可能”,在常量声明中,预声明的标识符表示连续的非类型化整数常量。”如果我有x:=make([[256]字节,8,16)
并且我想知道x
的字节大小,该怎么办unsafe.Sizeof(x)
将只返回12,无论分配了多少字节。@Hubro,您看到的12个字节是reflect.SliceHeader
类型的字节。这就是你用这个表达式创建的。计算实际尺寸需要一些手工工作。例如:(非常简单的概念证明)我认为这是不正确的,不安全。Sizeof
返回片段和字符串的标题大小,这只是一个指针和长度(加上片段的上限)。这将是一个恒定的大小。问题是关于value.reflect.TypeOf(i).Size()的内存使用情况
var i int
var u uint
var up uintptr
fmt.Printf("i Type:%T Size:%d\n", i, unsafe.Sizeof(i))
fmt.Printf("u Type:%T Size:%d\n", u, unsafe.Sizeof(u))
fmt.Printf("up Type:%T Size:%d\n", up, unsafe.Sizeof(up))