Anyway it means you can't cut and paste code from one place to another without changing '.' to '->' or vice-versa.
Anyway it means you can't cut and paste code from one place to another without changing '.' to '->' or vice-versa.
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.
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 7A chain of '.' on the other hand is always guaranteed to be resolved into a single offset at compile time.
Because using `(*ptr).member` everywhere is annoying. There's plenty of times you want or need to have direct access to a member rather than always dereferencing a pointer.
Here's a variation that seems plausible: make postfix p^ be like C's p[0], and infix p^i like C's p[i]. (With a tighter binding for ^ than C has.)
https://github.com/ekmett/lens/wiki/Examples
> ("hello","world")^._2