Computing.Net > Forums > Programming > Heap vs. Stack

Computer Problems? Computing.Net has over 1,000,000 posts about all things technology related! Click here to start participating now! Also, check out the New User Guide.

Heap vs. Stack

Reply to Message Icon

Name: Chad Johnson (by ChadJohnson)
Date: August 9, 2004 at 07:06:01 Pacific
OS: Win2K
CPU/Ram: n/a
Comment:

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?



Sponsored Link
Ads by Google

Response Number 1
Name: Chad Johnson (by ChadJohnson)
Date: August 9, 2004 at 07:12:15 Pacific
Reply:

Well nevermind about the differences, but which is better for the arrays I described?


0

Response Number 2
Name: StuartS
Date: August 9, 2004 at 10:26:03 Pacific
Reply:

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


0

Response Number 3
Name: Don Arnett
Date: August 9, 2004 at 10:26:22 Pacific
Reply:

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.


0

Response Number 4
Name: Don Arnett
Date: August 9, 2004 at 10:28:13 Pacific
Reply:

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".


0

Response Number 5
Name: Chad Johnson (by ChadJohnson)
Date: August 9, 2004 at 11:24:58 Pacific
Reply:

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)


0

Related Posts

See More



Response Number 6
Name: Don Arnett
Date: August 9, 2004 at 14:52:30 Pacific
Reply:

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.


0

Response Number 7
Name: Chad Johnson (by ChadJohnson)
Date: August 9, 2004 at 16:32:32 Pacific
Reply:

OK gotcha. Thanks!


0

Response Number 8
Name: gimmpy224
Date: August 9, 2004 at 22:17:55 Pacific
Reply:

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


0

Sponsored Link
Ads by Google
Reply to Message Icon

Software to create databa... PHP date help



Post Locked

This post is quite old and has been locked from receiving new replies. Please create a new posting instead.


Go to Programming Forum Home


Sponsored links

Ads by Google


Results for: Heap vs. Stack

Stack/Heap (C++) www.computing.net/answers/programming/stackheap-c/2293.html

Waht is Stack & Heap www.computing.net/answers/programming/waht-is-stack-amp-heap/6345.html

How to create a 2D Array? www.computing.net/answers/programming/how-to-create-a-2d-array/7137.html