Why do books say, "the compiler allocates space for variables in memory". Isn't it the executable which does that? I mean, for example, if I write the following program,
#include <iostream>
using namespace std;
int main()
{
int foo = 0;
cout<<foo;
return 0;
}
and compile it, and get an executable (let it be program.exe), now, if I run program.exe, this executable file will itself command to allocate some space for the variable foo. Won't it ? Please explain why books keep on saying, "the compiler will do this...do that" whereas actually, the compiled executable does that.
Adding another related question to this question, why is sizeof
called a compile-time operator ? Isn't it actually a run-time operator ?
The compiler generates machine instructions and works out what memory address local variables will occupy. Each local variable is given an address relative to the top of the stack, eg
foo
would be assumed to be at memory addressstack_pointer
. If you had a variablefoo2
it would be placed at addressstack_pointer + 4
where 4 is the size of anint
.When the local variable
foo
is accessed, the compiler will substitute the address held instack_pointer
. The hardware has a specialstack_pointer
register which always points to the top of the current stack.The compiler knows what size each variable is because it is responsible for looking at
struct
orclass
declarations and working out how it is laid out in memory. Sosizeof
is known at compile time and is treated as a constant expression. Primitive types likeint
are known to be of a certain size, egsizeof(int)
is 4.