在Go中,哪个片段分配的对象较少?或者他们都使用相同数量的分配,如果是这样的话; 为什么?(:
for i := 0; i < 10000000; i++ {
log.println("hello")
}
Run Code Online (Sandbox Code Playgroud)
下面的代码只分配1个字符串吗?
const (
HELLO string = "hello"
)
for i := 0; i < 10000000; i++ {
log.println(HELLO)
}
Run Code Online (Sandbox Code Playgroud)
这是您的程序的改编,在两种情况下都打印出基础字符串表示.
package main
import (
"fmt"
"reflect"
"unsafe"
)
const (
Hello string = "hello"
)
func main() {
for i := 0; i < 3; i++ {
a := "hello"
sh := (*reflect.StringHeader)(unsafe.Pointer(&a))
fmt.Println(a, " ", *sh)
}
fmt.Println()
for i := 0; i < 3; i++ {
a := Hello
sh := (*reflect.StringHeader)(unsafe.Pointer(&a))
fmt.Println(a, " ", *sh)
}
}
Run Code Online (Sandbox Code Playgroud)
这是输出:
hello {4870353 5}
hello {4870353 5}
hello {4870353 5}
hello {4870353 5}
hello {4870353 5}
hello {4870353 5}
Run Code Online (Sandbox Code Playgroud)
{}输出中的字符串头显示指向字符数据("hello")的指针,以及字符串的长度.
您可以看到整个程序中指向字符串数据的指针是相同的:字节数据"hello"仅在一个内存地址(此处为4870353)处引用,无论循环计数如何,无论是硬编码字符串还是一个常数.
语言规范本身并不保证这种行为,但是常量字符串实习是一种自然的优化,如果以任何明显不同的方式表现,它将是令人惊讶的.