Q:

Micro optimization - compiler optimization when accesing recursive members

I'm interested in writing good code from the beginning instead of optimizing the code later.  Sorry for not providing benchmark I don't have a working scenario at the moment.  Thanks for your attention! 
What are the performance gains of using FunctionY over FunctionX?  
There is a lot of discussion on stackoverflow about this already but I'm in doubts in the case when accessing sub-members (recursive) as shown below.  Will the compiler (say VS2008) optimize FunctionX into something like FunctionY? 
void FunctionX(Obj * pObj)
{
   pObj->MemberQ->MemberW->MemberA.function1();
   pObj->MemberQ->MemberW->MemberA.function2();
   pObj->MemberQ->MemberW->MemberB.function1();
   pObj->MemberQ->MemberW->MemberB.function2();
   ..
   pObj->MemberQ->MemberW->MemberZ.function1();
   pObj->MemberQ->MemberW->MemberZ.function2();
}

void FunctionY(Obj * pObj)
{
   W * localPtr = pObj->MemberQ->MemberW;
   localPtr->MemberA.function1();
   localPtr->MemberA.function2();
   localPtr->MemberB.function1();
   localPtr->MemberB.function2();
   ...
   localPtr->MemberZ.function1();
   localPtr->MemberZ.function2();
}

A:

In case none of the member pointers are volatile or pointers to volatile and you don't have the operator -> overloaded for any members in a chain both functions are the same. 
The optimization rule you suggested is widely known as Common Expression Elimination and is supported by vast majority of compilers for many decades.