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))