2018-04-02 22:21:26 +00:00
|
|
|
[< back to index](../index.md)
|
|
|
|
|
2018-01-04 00:15:04 +00:00
|
|
|
# Variable storage
|
|
|
|
|
|
|
|
Variables in Millfork can belong to one of the following storage classes:
|
|
|
|
|
|
|
|
* static: all global variables; local variables declared with `static`
|
|
|
|
|
|
|
|
* stack: local variables declared with `stack`
|
|
|
|
|
|
|
|
* automatic: other local variables
|
|
|
|
|
|
|
|
* parameter: function parameters
|
|
|
|
|
|
|
|
Variables can also belong to one of the following memory segments
|
2018-01-31 21:25:06 +00:00
|
|
|
(unless overridden with the `@` operator):
|
2018-01-04 00:15:04 +00:00
|
|
|
|
|
|
|
* zeropage: all `pointer` variables and parameters
|
|
|
|
|
|
|
|
* high RAM: all the other variables and parameters
|
|
|
|
|
|
|
|
All arrays can be considered static.
|
|
|
|
|
|
|
|
## Static variables
|
|
|
|
|
|
|
|
Static variables have a fixed and unique memory location.
|
|
|
|
Their lifetime is for the entire runtime of the program.
|
|
|
|
If they do not have initial value declared, reading them before initialization yields an undefined value.
|
|
|
|
|
|
|
|
## Stack variables
|
|
|
|
|
|
|
|
Stack variables, as their name suggests, live on the stack.
|
|
|
|
Their lifetime starts with the beginning of the function they're in
|
|
|
|
and ends when the function returns.
|
|
|
|
They are not automatically initialized before reading, reading them before initialization yields an undefined value.
|
|
|
|
The main advantage is that they are perfectly safe to use in reentrant code,
|
|
|
|
but the main disadvantages are:
|
|
|
|
|
|
|
|
* slower access
|
|
|
|
|
|
|
|
* bigger code
|
|
|
|
|
|
|
|
* increased stack usage
|
|
|
|
|
|
|
|
* cannot take their addresses
|
|
|
|
|
|
|
|
* cannot use them in inline assembly code blocks
|
|
|
|
|
|
|
|
## Automatic variables
|
|
|
|
|
|
|
|
Automatic variables have lifetime starting with the beginning of the function they're in
|
|
|
|
and ending when the function returns.
|
|
|
|
Most automatic variables reside in memory.
|
|
|
|
They can share their memory location with other automatic variables and parameters,
|
|
|
|
to conserve memory usage.
|
2018-06-25 19:29:04 +00:00
|
|
|
Some small automatic variables may be inlined to registers.
|
2018-01-04 00:15:04 +00:00
|
|
|
They are not automatically initialized before reading, reading them before initialization yields an undefined value.
|
|
|
|
Automatic local variables are not safe to use with reentrant functions, see the [relevant documentation](../lang/reentrancy.md) for more details.
|
|
|
|
|
2018-02-01 21:39:38 +00:00
|
|
|
Automatic variables defined with the `register` keyword will have the priority when it comes to register allocation.
|
|
|
|
|
2018-01-04 00:15:04 +00:00
|
|
|
## Parameters
|
|
|
|
|
2018-03-28 17:47:44 +00:00
|
|
|
Function parameters have lifetime starting with the beginning
|
2018-01-04 00:15:04 +00:00
|
|
|
of the function call to the function they're defined in
|
|
|
|
and ending when the function returns.
|
|
|
|
They reside in memory and can share their memory location with other parameters and automatic variables,
|
|
|
|
to conserve memory usage.
|
2018-06-25 19:29:04 +00:00
|
|
|
Unlike automatic variables, they are almost never inlined into registers.
|
2018-01-04 00:15:04 +00:00
|
|
|
Parameters are not safe to use with reentrant functions, see the [relevant documentation](../lang/reentrancy.md) for more details.
|
|
|
|
|
|
|
|
|