4 ms·
>A '->' is always a runtime indirection It's not true if the compiler can figure out that the left side is a constant, consider: struct foo { int a; };
by jhallenworld 6y ago
>A '->' is always a runtime indirection
It's not true if the compiler can figure out that the left side is a constant, consider:
struct foo { int a; };
struct foo z = { 7 };
struct foo *const p = &z;
Then in z->a, no indirection is necessary. GCC -O2 makes this:
int fred() { return p->a; }
fred:
movl z(%rip), %eax
ret
p:
.quad z
z:
.long 7
- flohofwoe 6y agoThat'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.