|
|
|
Using the Stack to pass parameters
- visual depiction of run-time storage
- heap
- freelist - list of free space
- on allocation - memory manager finds space and marks it as used
changing freelist
- on deallocation - memory manager marks space as free changing
freelist
- memory fragmentation - memory fragments into small blocks over
lifetime of program
- garbage collection - coalesce fragments, possibly moving objects
(must be careful of pointers when moving!)
- stack
- clean and efficient support for nested functions and recursion
- central concept is stack frame
(also called activation record), includes
- visual depiction of frame
- parameters
- return address - where to begin execution when function exits
- dynamic link - pointer to caller's stack frame
- static link - pointer to lexical parent (for nested functions)
- return value - where to put the return value
- local variables
- local work space - for temporary storage of results
- function call - push stack frame
- function exit - pop stack frame
- visual depiction of stack calls
- example
int x; /* static storage */
void main() {
int y; /* dynamic stack storage */
char *str; /* dynamic stack storage */
str = malloc(100); /* allocates 100 bytes of dynamic heap storage */
y = foo(23);
free(str); /* deallocates 100 bytes of dynamic heap storage */
} /* y and str deallocated as stack frame is popped */
int foo(int z) { /* z is dynamic stack storage */
char ch[100]; /* ch is dynamic stack storage */
if (z == 23) foo(7);
return 3; /* z and ch are deallocated as stack frame is popped,
3 put on top of stack */
}
- at the start of the program
- after the first call to foo
- after the second call to foo
Source of Information
These lecture notes are based on Chapter 10 in "Programming Languages, 6ed"
by Robert Sebesta and Chapter 3 in
"Programming Language Concepts and Paradigms" by David Watt.
|