I wonder if it is good or bad (or does not matter) if I reuse the variable names as much as possible? for example
int main(void){
//...
int x=0;
//..
x = atoi(char_var);
//..
for (x=0; x<12; x++){
//...
}
//..
x = socket(...)
if(x<0){
//...
}
for(x=0;x<100;x++{
//...
}
return 0;
}
Another variables could be used instead of x
above (might be better for readability), but I wonder if it would provide me any benefit for the binary size, performance, or anything else?
In general it's very poor practice to reuse variable names for different purposes - if someone else needs to maintain your code later on the person will have to find these "context switches" in your code where x
now suddenly means something other than what it meant before that line of code.
You may get some memory savings but that's so small compared to the problems it introduces that it's advised against. (Read the edit below, too.)
Typically it's also recommended not to use 1-character variable names for other than loop counters. One could argue that x
could also be an X coordinate but I'd use some prefix or a longer name in that case. Single-letter variable names are too short to give meaningful hints about the purpose of a variable.
Edit: as several comments (and some of the other answers) pointed out, the potential memory savings (if any) depend on how good the compiler is. Well-written optimizing compilers may realize that two variables have no overlapping lifetimes so they only allocate one variable slot anyway. The end result would be no run-time gain and still less maintainable source code. This just reinforces the argument: don't reuse variables.
As with almost everything in programming, it depends on the situation.
If you're reusing the same variable for different purposes, then it makes your code less readable and you shouldn't be doing it. If the purpose is the same (e.g. loop counters), then you can reuse with no problem since this isn't making your code less readable.
Reusing a variable will avoid reserving space in the stack, which results in a faster (you don't waste time reserving space in stack and pushing the value) and less memory consuming (you're not storing it in the stack) program. But this benefits are absolutely negligible in the whole program context, and also relative to architecture, language and compiler. So I would worry more about readability than this tiny benefits.
Bad. For simple types like int
s, passed by value, the compiler will be able to figure out when they are unneeded and reuse the space.
For example, I compiled the following C++ code in Visual Studio 2010 using 32-bit Release mode:
for (int i = 0; i < 4; ++i)
{
printf("%d\n", i);
}
for (int j = 0; j < 4; ++j)
{
printf("%d\n", j);
}
and got the following assembler output:
; 5 : for (int i = 0; i < 4; ++i)
mov edi, DWORD PTR __imp__printf
xor esi, esi
npad 6
$LL6@main:
; 6 : {
; 7 : printf("%d\n", i);
push esi
push OFFSET ??_C@_03PMGGPEJJ@?$CFd?6?$AA@
call edi
inc esi
add esp, 8
cmp esi, 4
jl SHORT $LL6@main
; 8 : }
; 9 :
; 10 : for (int j = 0; j < 4; ++j)
xor esi, esi
$LL3@main:
; 11 : {
; 12 : printf("%d\n", j);
push esi
push OFFSET ??_C@_03PMGGPEJJ@?$CFd?6?$AA@
call edi
inc esi
add esp, 8
cmp esi, 4
jl SHORT $LL3@main
; 13 : }
You can see that the compiler is using the esi
register for both i
and j
.
int x=0;
//..
x = atoi(char_var);
//..
int x = 0;
You cannot redeclare x
in the same scope. If you are not redeclaring it but using it for different purposes, you are free to do this. But it's a bad practice and should be avoided as it decreases code readability. Also you should find meaningful names for your variables for the same reasons.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With