I think if there are two variables of the same size in the same function but declared in different scope (like one in the true and the other in the false (else) branch of an 'if' statement), a smart enough compiler might save some space by not allocating space for both of them on the stack. I am not sure if this is done by any compiler in the real world though.
I think this is done fairly often. The Texas Instruments compiler I use at work does this often even when the variables are declared in the same scope. Because the CPU has plenty of registers, most variables never go into the stack. This makes debugging an interesting experience, since the variables can jump from a register to another or even disappear without warning and the debugger mostly can't keep up.