This should only be valid for a loop that doesn’t include any function calls, 
or if the compiler can prove that said function calls don’t involve any 
synchronization primitives anywhere in the possible call stack.

So maybe it’s optimized in

for … {
  total += *p
}

but I wouldn’t bet on it in

for … {
  total += *p
  foo()
}

//jb

On 30 Nov 2018, at 19:01, robert engels 
<reng...@ix.netcom.com<mailto:reng...@ix.netcom.com>> wrote:

I would think the compiler would be free to optimize this as a single load 
outside the loop - as Go has no volatile declaration (to inform the compiler 
that some other thread might of changed the value of *p)

On Nov 30, 2018, at 11:58 AM, robert engels 
<reng...@ix.netcom.com<mailto:reng...@ix.netcom.com>> wrote:

It’s as simple as:

var count = 1
var p = &count

func X() {
 total :=0

 for i:=0; i <1000000;i++ {
    total = total + *p
 }
}

no ?

On Nov 30, 2018, at 11:48 AM, Mark Volkmann 
<r.mark.volkm...@gmail.com<mailto:r.mark.volkm...@gmail.com>> wrote:

I think I failed to come up with a good code example. But suppose I need to do 
something with a pointer inside a loop that really does require dereferencing 
it and the pointer never changes inside the loop. In that case will the Go 
compiler optimize that so the dereference doesn't happen in each loop iteration?

On Fri, Nov 30, 2018 at 11:36 AM Jan Mercl 
<0xj...@gmail.com<mailto:0xj...@gmail.com>> wrote:

On Fri, Nov 30, 2018 at 6:16 PM Mark Volkmann 
<r.mark.volkm...@gmail.com<mailto:r.mark.volkm...@gmail.com>> wrote:

> Will the Go compiler optimize the pointer dereference so it doesn't happen in 
> every loop iteration? If not, is it common practice to do that outside the 
> loop like this?
>
> myValue := *myPtr
> for _, v := range values {
>         fmt.Printf("%v %v\n", myValue, v)
> }

There's no pointer dereference inside the loop. But there's an allocation 
inside the loop, on every iteration, that puts a pointer to a copy of myValue 
into an interface{} that's passed to fmt.Printf. The allocation can be probably 
avoided:

myValue := interface{}(*myPtr)
for _, v := range values {
        fmt.Printf("%v %v\n", myValue, v)
}

But the %v verb handle pointers in many cases well. If that holds for the type 
of *myPtr then simply:

for _, v := range values {
        fmt.Printf("%v %v\n", myPtr, v)
}

is what could be good enough.

--

-j


--
R. Mark Volkmann
Object Computing, Inc.

--
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 
golang-nuts+unsubscr...@googlegroups.com<mailto:golang-nuts+unsubscr...@googlegroups.com>.
For more options, visit https://groups.google.com/d/optout.


--
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 
golang-nuts+unsubscr...@googlegroups.com<mailto:golang-nuts+unsubscr...@googlegroups.com>.
For more options, visit https://groups.google.com/d/optout.


--
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 
golang-nuts+unsubscr...@googlegroups.com<mailto:golang-nuts+unsubscr...@googlegroups.com>.
For more options, visit https://groups.google.com/d/optout.

-- 
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 golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to