A friend of mine once asked me what the following code does.
register int a; a ^= a;
After a bit of thought I realized that “a” gets initialized to zero. But why do it that way when you can do it like this:
int a; a = 0;
The answer lies in the machine translation for each of these segments. Let’s look at it one piece at a time. The first code segment requests “a” to be part of one of the several general paramenter registers in the CPU. If that’s granted then the statement a^=a; is simple XOR edx, eax.
Compared to the second code: Which moves 0 to a register – 1 instruction does several (I would think around 2) pushl ‘s whereas the first one does XOR …,… directly.
I compiled the above two programs GCC reported a net savings of 9 bytes. That’s just with one use of this technique other uses will give a greater net-savings if used properly.
Without a doubt this will affect maintenance and readibility of the code; and perhaps shouldn’t be used on production systems. But when you need to squeeze that little extra bit out so that everything fits on one frame — you have to do what you have to do!