That's (usually) only true for the very first '->' in a chain and as you said, depends on the compiler figuring out if the pointer indirection can be resolved at compile time.
A chain of '.' on the other hand is always guaranteed to be resolved into a single offset at compile time.
E.g. a:
int x = a->b->c->d;
means there's 3 memory accesses, while
int x = a.b.c.d;
means there's one memory access for the whole expression.
Also consider this:
int x = a->b.c->d;
I can immediately see where pointer indirections are happening.
...unless you're in C++ of course which messed up this simple rule when references were added to the language.