On Fri, Nov 30, 2018 at 11:09 AM Jakob Borg <ja...@kastelo.net> wrote: > > 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.
...or any potential pointer aliases: p:=&value q:=&value for ... { total+=*p (*q)++ } > > 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> 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> 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> 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> wrote: >> >> >> On Fri, Nov 30, 2018 at 6:16 PM Mark Volkmann <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. > 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. > > > > -- > 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. > > > -- > 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. -- 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.