Yes you are right . thanks a lot and I try more debug info and have
looked that:
func main() {
println("debug")
a := interface{}(100)
println(&a, a)
b := fmt.Sprint(a)
println("debug1", b, &b, Pointer(*((*uintptr)(Pointer(&b)))), *((*int)(
Pointer(uintptr(Pointer(&b)) + 8))))
}
and add debug info to runtime/mallocgc.go file
here is the output:
debug
mallocgc: 8
mallocgc return2: 0xc20800a220
0xc208039f68 (0xa00a0,0xc20800a220)
mallocgc: 3
mallocgc return2: 0xc20800a230
debug1 100 0xc208039f48 0xc20800a230 3
在 2016年10月3日星期一 UTC+8上午9:47:18,Dave Cheney写道:
>
> On Monday, 3 October 2016 12:39:34 UTC+11, 刘桂祥 wrote:
> > package main
> >
> >
> > import (
> > "fmt"
> > )
> > func main() {
> > a := interface{}(100)
> > println(&a, a)
> > fmt.Sprint(a)
> > }
> >
> >
> > go run x.go the output:
> >
> >
> > 0xc42003bf18 (0x89040,0xc42000a2c0)
> >
> >
> >
> > I just want to ask 0xc42000a2c0 as the a (interface{}) 's data pointer
> is point to where ? heap ?
>
> It is on the heap, the value escapes when passed to fmt,Sprint
>
> >
> > also I test this:
> >
> >
> > func BenchmarkFmtEscap3(b *testing.B) {
> > b.ReportAllocs()
> >
> >
> > for i := 0; i < b.N; i++ {
> > a := interface{}(100)
> > fmt.Sprint(a)
> > }
> > }
> >
> >
> > BenchmarkFmtEscap3-4 10000000 141 ns/op
> 16 B/op 2 allocs/op
> >
> >
> >
> > why is 2 allocs and 16bytes ??
>
> One for a, which escapes to the heap when passed to fmt.Sprint, and one
> for the value returned from fmt,Sprint
>
>
--
You received this message because you are subscribed to the Google Groups
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.