2 回答
TA贡献1847条经验 获得超7个赞
该代码中的任何内容都不需要i在堆上分配。它可能在堆栈上,超出范围时被释放,或者在寄存器中,并且在任何一种情况下都不会产生垃圾。(如果您对这如何可能感到好奇,则该技术称为转义分析。)您可以在此示例程序中 TotalAlloc 如何不增加中看到它:
package main
import (
"fmt"
"runtime"
)
func loop() {
for i := 0; i < 500; i++ {
}
}
func main() {
m1, m2 := new(runtime.MemStats), new(runtime.MemStats)
runtime.ReadMemStats(m1)
loop()
runtime.ReadMemStats(m2)
fmt.Println("TotalAlloc delta was", m2.TotalAlloc - m1.TotalAlloc)
}
一个计数器是必要的,以确保您以一种或另一种方式执行 500 次循环迭代,因此即使您找到某种方法使计数器隐含(r := make([]struct{}, 500); for range r {...}例如),也不会有变量名称但仍然是一个计数器盖子。
TA贡献1796条经验 获得超10个赞
如果你讨厌计数器,你可以使用这个:
for _ = range make([]struct{}, 500) {
PlayRandomGame()
}
但是带有计数器的变体更加惯用。
- 2 回答
- 0 关注
- 244 浏览
添加回答
举报