In C++, what is the difference between allocating memory on the heap vs. allocating it on the stack? (new vs. normal declaration)
Which would be better for an array of two elements? What if you have 100 arrays of 2 elements? Which is better for an array of 2000 elements?
Use the Heap. I would read up on what the Stack and the Heap are, particularly the Stack. The Stack is used for a particular purpose and trying to use it for other purpose is a sure way to crash your application in double quick time.
Stuart
Why "nevermind the differences"? Understanding the differences will help you make these decisions yourself.
I will assume that you know what the stack is for, so won't describe that:
Stack:
- local variables (variables declared inside a function) are put on the stack - unless they are also declared as 'static' or 'register'
- function parameters are allocated on the stack
- local variables that are declared on the stack are not automatically initialized by the system so they usually have garbage in them until you set them
- variables on the stack disappear when the function exits (thus, if a function is called multiple times, it's local variables and parameters are recreated and destroyed each time the function is called end exited).Heap:
- declared variables (as opposed to dynamically created ie new, malloc) are created on the heap before program execution begins, they exist the entire life of the program (although scope may prevent access to them - they still exist) and they are initialized to all zeros
- global variables are on the heap
- static local variables are on the heap (this is how they keep their value between function calls)
- memory allocated by new, malloc and calloc are on the heap
So now, on to the question of where to put your arrays. You want to consider:- the size - the stack has a limit size, so large arrays should be allocated in the heap. Sometimes having too many local variables or large local arrays will cause stack overflow errors
- do you want the values held between function calls (if yes, put on heap, if not, can be on stack)
- is initialization of the array time consuming (if yes, may want to put on heap so that you have to initialize only once)
Remember that using 'new' rather than 'normal declaration' is not the only way to move variables from the stack to the heap:- you can make a local variable static - this puts it on the heap but keeps the scope local to the function - remember it keeps it's value between function calls
- you can make it global - but scope allows 'everyone' to access it.So let's look at your three specific examples:
- an array of 2 elements
I wouldn't worry about it. Make it local and thus on the stack.- an array of 2000 elements
I'd usually make this global or allocate with new to keep the stack size down. But if it's a small program, who cares.- 100 arrays of 2 elements
I wouldn't make 100 arrays of 2 elements. I'd make a 2 dimensional array (100x2) and probably put on the heap. Since you normally want to avoid global variables, I'd consider putting it on the heap by using dynamic allocation or making it static and initializing only the first time thru the array. BUt it partially depends upon what is stored in the array and how dynamic the data is.This is a quick response to a not trivial question. Hope it helps some.
I would disagree with Stuart's blanket "use the heap". But would agree with reading up on both the stack and heap so that you can make informed decisions.
But, if in doubt, "use the heap" is safer than "use the stack".
alright. If I declare an array on the heap inside main (),
char *buffer = new char [2000];
will it be global?
(the 100 arrays of 2 was just an example)
If 'buffer' is declared inside main(), ie:
main()
{
char *buffer = new char[2000];}
Then 'buffer' is not global. The fact that the new allocates the memory on the heap, doesn't change anything about the variable 'buffer'.'buffer' is still local to main. Obviously, if you have functions that are called from main that need to use 'buffer', you'll have to pass 'buffer' as a parameter.
The only way to make anything global (that i am aware of) is to define it outside of the functions.
For example, defining it right after your includes.GIMPS
| « Software to create databa... | PHP date help » |
Get Solutions to your Hi-Tech Issues Now!