From: Alexey Dobriyan > Sent: 14 December 2016 13:20 ... > > If you have foo->bar[id - const] then the compiler has to add the > > offset of 'bar' and subtract for 'const'. > > If the numbers match no add or subtract is needed. > > > > It is much cleaner to do this by explicitly removing the offset on the > > accesses than using a union. > > Surprisingly, the trick only works if array index is cast to "unsigned long" > before subtracting. > > Code becomes > > ... > ptr = ng->ptr[(unsigned long)id - 3]; > ...
The compiler may also be able to optimise it away if 'id' is 'int' rather than 'unsigned int'. Oh, if you need casts like that use an accessor function. David