You guys need to think about what the compiler and CPU are doing. I thought dmroeder's initial conclusion was obvious. Think about what the computer is doing to compute the address using an array of UDTs. First the computer will multiply the index by the size of the UDT. Then it will add the offset of the item/field of the UDT. Then it will add the base address of the array itself. If the compiler is efficient, it will at compile time add the offset of the field of the variable in the UDT and the base of the compiler so only one addition needs to be done. There are no other ways to make this more efficient.
It is too bad we can't see the code that is generated. Most compilers have an option to generate either the raw assembly language or the list file showing the assembly language compiled so one can see the binary code generated too.