AVR local and global variable program size
Global variables are placed in the .data section of your program (if explicitly initialized) or in the .bss section (if not initialized). The initial values for global variables are copied over from flash upon start up by the __do_copy_data() function (added by the linker scripts if needed) and the initialization of the variables in .bss to zero (this is mandated by the C standard) is done by __do_clear_bss(). Your program includes symbols which tell it the size of these two segments. Code must be included to handle these events. Note that sometimes these variables can be bound to a register.

Local variables on the other hand reside either in registers or the stack. Being a modified Harvard Machine, AVR has a large number of registers, thus, if local variables can be put there, they will, as to avoid memory access. This means that for local variables, if residing in the stack, there must be code to


Increase the stack frame for your function.
Initialize the values of these variables.
Perform a load/modify/store cycle every time they change (this also needs to be done for globals).


As a result, depending on the amount of code that needs to be added to the binary will change. For further details, you can see what is actually happening by disassembling your binary (avr-objdump is a good starting place) and by listing the symbols in the file (avr-nm).

Cheers.