Visit Our UNIX and Linux User Community


Use of alloca function


 
Thread Tools Search this Thread
Top Forums Programming Use of alloca function
# 1  
Old 10-26-2009
Use of alloca function

Hello ,

i have read the manual page of alloca ,
it is documented there that "alloca works similar to the malloc but it allocates memory from stack and frees automatically".

i can't get how can i use that in a program .
if i'm not wrong can i use that like :

Code:
#include<stdio.h>
#include<alloca.h>
int main()
{
        void *p;
        p=alloca(20);
        if(p==NULL)
        {
                printf("alloca failed");
                exit(1);
        }
 
        strcpy(p,"Hello");
        printf("%s\n",p);
        printf("%u\n",p);
 
        return 0;
}

and what is the advantage of such a function.

even if i use array it also allocates memory from the stack and memory will be freed automatically.

what is the more advantage its having than array.
# 2  
Old 10-26-2009
Have a read of this:

Advantages of Alloca - The GNU C Library

Regards
# 3  
Old 10-26-2009
One advantage of alloca() that page doesn't directly address is that alloca() allocates memory that's already under the control of the thread that's making the call, so in multi-threaded applications alloca() can be many orders of magnitude faster than malloc()-based calls.

IMO the link on that page to alloca() disadvantages doesn't stress the major disadvantage of alloca() strongly enough - running out of memory. With malloc()-based allocation, you've got to get pretty extreme before you'll run out of memory. But with alloca(), all you have to work with is the stack of the current thread, which may be quite small, and unless you've directly addressed thread stack size is probably only a few MB at most.

In other words, in order to use alloca() safely you have to really, really know how much memory your entire process is using and where all that memory is coming from.

But if you take care and know what you're doing, you can make multi-threaded apps tremendously faster using alloca().
# 4  
Old 10-26-2009
Use of alloca is discouraged because it is system dependent...also the memory returned cant be passed to other functions since it is freed as soon as the function that calls alloca exits. With alloca portability is the biggest concern if developing apps for different platforms.
# 5  
Old 10-26-2009
Quote:
Originally Posted by shamrock
Use of alloca is discouraged because it is system dependent...
How system dependent? Linux has it, Windows has it, IRIX has it, Solaris has it, BSD has it, OSX has it, HPUX seems to have it... The only platform I can think of offhand that I can't verify is AIX, and that's a "maybe", not a "no". It seems too useful, even internally, for vendors to not implement... I will admit that some embedded platforms implement it badly(a severe error on systems with no malloc!), allowing alloca'd memory to be overwritten by further function calls, but I'm not aware of an embedded platform with threading. I suspect the kind of stack management needed for threading also lets alloca exist.
Quote:
also the memory returned cant be passed to other functions since it is freed as soon as the function that calls alloca exits.
You can certainly pass it to other functions if you keep in mind its scope, the exact same way you can pass references to stack variables if you keep in mind their scope. For a thread, it will be valid as long as the thread exists.
Quote:
With alloca portability is the biggest concern if developing apps for different platforms.
Please note any platforms you know of that don't have alloca.

Last edited by Corona688; 10-26-2009 at 12:53 PM..
# 6  
Old 10-26-2009
Quote:
Originally Posted by Corona688
How system dependent? Linux has it, Windows has it, IRIX has it, Solaris has it, BSD has it, OSX has it, HPUX seems to have it... The only platform I can think of offhand that I can't verify is AIX, and that's a "maybe", not a "no".
AIX has it too. I work primarily on AIX and HP-UX platforms and their man pages explicitly state that alloca should not be used because it's sytem dependent. Why they dont say that...perhaps because different MPUs manage stacks differently. What if one mpu had its stack growing towards high memory instead of low memory...that itself would be a portability problem.
Quote:
Originally Posted by Corona688
It seems too useful, even internally, for vendors to not implement... I will admit that some embedded platforms implement it badly(a severe error on systems with no malloc!), allowing alloca'd memory to be overwritten by further function calls, but I'm not aware of an embedded platform with threading. I suspect the kind of stack management needed for threading also lets alloca exist.
It's more so of an issue on embedded platforms because of the limited resources...why allocate memory with alloca in each function frame when you can allocate it once with malloc and keep reusing it.
Quote:
Originally Posted by Corona688
You can certainly pass it to other functions if you keep in mind its scope, the exact same way you can pass references to stack variables if you keep in mind their scope.
It can certainly be passed to a nested function but can't be returned from one function to another the same way that a malloc'd pointer can be.
Quote:
Originally Posted by Corona688
For a thread, it will be valid as long as the thread exists. Please note any platforms you know of that don't have alloca.
I don't know of any platforms that don't support alloca apart from embedded OSes however as the manpages say it is system dependent. Personally I have never used alloca because it is really of no use when it cant be returned. Curious if you can come up with a scenario where it's use would be more befitting than malloc.
# 7  
Old 10-26-2009
FWIW - solaris alloca man page:
Quote:
WARNINGS
Undefined results will occur if the size requested for a
block of memory exceeds the maximum size of a process's
heap, which can be obtained with getrlimit(2)

The alloca() function is machine-, compiler-, and most of
all, system-dependent. Its use is strongly discouraged.
Maybe it has to do with implementing stack frames in different architectures from a single vendor? This is from an Ultrasparc IIIi multi-cpu box.

Linux:
Quote:
The alloca() function is machine and compiler dependent. On many systems its implementation is buggy. Its use is discouraged.

On many systems alloca() cannot be used inside the list of arguments of a function call, because the stack space reserved by alloca() would appear on the stack in the middle of the space for the function arguments.
I added the red.

Previous Thread | Next Thread
Test Your Knowledge in Computers #721
Difficulty: Easy
In 2011, Alan Minsky was inducted into IEEE Intelligent Systems AI Hall of Fame for the "significant contributions to the field of AI and intelligent systems&".
True or False?

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Function - Make your function return an exit status

Hi All, Good Day, seeking for your assistance on how to not perform my 2nd, 3rd,4th etc.. function if my 1st function is in else condition. #Body function1() { if then echo "exist" else echo "not exist" } #if not exist in function1 my all other function will not proceed.... (4 Replies)
Discussion started by: meister29
4 Replies

2. Shell Programming and Scripting

How to pass variable from one function to another function?

updateEnvironmentField() { linewithoutquotes=`echo $LINE | tr -d '"'` b() } I want to pass variable named $linewithoutquotes to another method called b(), which is called from updateEnvironmentField() method. How to do the above requirement with shell script (1 Reply)
Discussion started by: pottic
1 Replies

3. Shell Programming and Scripting

Need help on awk for printing the function name inside each function

Hi, I am having script which contains many functions. Need to print each function name at the starting of the function. Like below, functionname() { echo "functionname" commands.... } I've tried like below, func=`grep "()" scriptname | cut -d "(" -f1` for i in $func do nawk -v... (4 Replies)
Discussion started by: Sumanthsv
4 Replies

4. Shell Programming and Scripting

Will files, creaetd in one function of the same script will be recognized in another function?

Dear All. I have a script, which process files one by one. In the script I have two functions. one sftp files to different server the other from existing file create file with different name. My question is: Will sftp function recognize files names , which are created in another... (1 Reply)
Discussion started by: digioleg54
1 Replies

5. Shell Programming and Scripting

Help to Modify File Name in each function before calling another function.

I have a script which does gunzip, zip and untar. Input to the script is file name and file directory (where file is located) I am reading the input parameters as follows: FILENAME=$1 FILEDIR=$2 I have created 3 functions that are as follows: 1) gunzip file 2) unzip file... (2 Replies)
Discussion started by: pinnacle
2 Replies

6. Programming

How to step in one function after the function be executed in gdb?

In gdb, I can call one function with command "call", but how can I step in the function? I don't want to restart the program, but the function had been executed, gdb will execute next statement, and I don't know how to recall the function. (4 Replies)
Discussion started by: 915086731
4 Replies

7. Shell Programming and Scripting

pass function as argument to a function

I have the following code : function1 () { print "January" } function2() { case $1 in January) print "Dzisiaj mamy styczen" ;; *) ;; } main() { (1 Reply)
Discussion started by: presul
1 Replies

8. Shell Programming and Scripting

SHELL SCRIPT Function Calling Another Function Please Help...

This is my function which is creating three variables based on counter & writing these variable to database by calling another function writeRecord but only one record is getting wrote in DB.... Please advise ASAP...:confused: function InsertFtg { FTGSTR="" echo "Saurabh is GREAT $#" let... (2 Replies)
Discussion started by: omkar.sonawane
2 Replies

9. Shell Programming and Scripting

Return a value from called function to the calling function

I have two scripts. script1.sh looks -------------------------------- #!/bin/bash display() { echo "Welcome to Unix" } display ----------------------------- Script2.sh #!/bin/bash sh script1.sh //simply calling script1.sh ------------------------------ (1 Reply)
Discussion started by: mvictorvijayan
1 Replies

10. Shell Programming and Scripting

Passing global variable to a function which is called by another function

Hi , I have three funcions f1, f2 and f3 . f1 calls f2 and f2 calls f3 . I have a global variable "period" which i want to pass to f3 . Can i pass the variable directly in the definition of f3 ? Pls help . sars (4 Replies)
Discussion started by: sars
4 Replies

Featured Tech Videos