From: Igor G. <gn...@di...> - 2002-09-14 07:36:29
|
some projects I use assume alloca() function is declared in stdlib.h now I see there is NO DEFINITION of alloca() anywhere in mingw/include/* Is alloca() POSIX, ansi ? How can I emulate it ? -- Igor Gnip <gn...@di...> |
From: Earnie B. <ear...@ya...> - 2002-09-14 11:58:21
|
Igor Gnip wrote: > > some projects I use assume alloca() function is declared in stdlib.h > > now I see there is NO DEFINITION of alloca() anywhere in > mingw/include/* > > Is alloca() POSIX, ansi ? > The real question to ask is, does MSVCRT.DLL include an alloca? Anyone know? > How can I emulate it ? > It's a builtin function for GCC, just use it. As far as it not being in a header file, I will add this to my round tuit file. Earnie. |
From: Luke D. <cod...@ho...> - 2002-09-14 17:19:47
|
----- Original Message ----- From: "Earnie Boyd" <ear...@ya...> To: "Igor Gnip" <gn...@di...> Cc: <min...@li...> Sent: Saturday, September 14, 2002 7:58 PM Subject: Re: [Mingw-users] alloca function does not exist ??? > Igor Gnip wrote: > > > > some projects I use assume alloca() function is declared in stdlib.h > > > > now I see there is NO DEFINITION of alloca() anywhere in > > mingw/include/* > > > > Is alloca() POSIX, ansi ? > > > > The real question to ask is, does MSVCRT.DLL include an alloca? Anyone > know? > > > How can I emulate it ? > > > > It's a builtin function for GCC, just use it. > > As far as it not being in a header file, I will add this to my round > tuit file. > > Earnie. The only thing I found on MSDN was _alloca(), which seems equivalent to alloca(), and which is documented as being in malloc.h. However, _alloca() does not appear in the list of exported symbols in msvcrt.dll so it is probably built-in to the MSVC compiler or an inline assembler function (I haven't checked an MS header yet). AFAICT alloca() is not ANSI so I don't believe it needs to be in any header file. To be compatible with MSVC, we could do something equivalent to "#define _alloca alloca" in malloc.h unless in strict ANSI mode (yes I hear the gasps about macros, so if an inline function is possible then that would be good). Luke Dunstan |
From: Mikael A. <mik...@te...> - 2002-09-14 17:25:17
|
Hi ! I havn't checked, but the MSDN docs says that _alloca should be in all the C runtime libraries... Mikael ----- Original Message ----- From: "Luke Dunstan" <cod...@ho...> To: "Igor Gnip" <gn...@di...>; <min...@li...> Sent: Saturday, September 14, 2002 6:28 PM Subject: Re: [Mingw-users] alloca function does not exist ??? > > ----- Original Message ----- > From: "Earnie Boyd" <ear...@ya...> > To: "Igor Gnip" <gn...@di...> > Cc: <min...@li...> > Sent: Saturday, September 14, 2002 7:58 PM > Subject: Re: [Mingw-users] alloca function does not exist ??? > > > > Igor Gnip wrote: > > > > > > some projects I use assume alloca() function is declared in stdlib.h > > > > > > now I see there is NO DEFINITION of alloca() anywhere in > > > mingw/include/* > > > > > > Is alloca() POSIX, ansi ? > > > > > > > The real question to ask is, does MSVCRT.DLL include an alloca? Anyone > > know? > > > > > How can I emulate it ? > > > > > > > It's a builtin function for GCC, just use it. > > > > As far as it not being in a header file, I will add this to my round > > tuit file. > > > > Earnie. > > The only thing I found on MSDN was _alloca(), which seems equivalent to > alloca(), and which is documented as being in malloc.h. However, _alloca() > does not appear in the list of exported symbols in msvcrt.dll so it is > probably built-in to the MSVC compiler or an inline assembler function (I > haven't checked an MS header yet). AFAICT alloca() is not ANSI so I don't > believe it needs to be in any header file. To be compatible with MSVC, we > could do something equivalent to "#define _alloca alloca" in malloc.h unless > in strict ANSI mode (yes I hear the gasps about macros, so if an inline > function is possible then that would be good). > > Luke Dunstan > > > > ------------------------------------------------------- > This sf.net email is sponsored by:ThinkGeek > Welcome to geek heaven. > http://thinkgeek.com/sf > _______________________________________________ > MinGW-users mailing list > Min...@li... > > You may change your MinGW Account Options or unsubscribe at: > https://lists.sourceforge.net/lists/listinfo/mingw-users |
From: Greg C. <chi...@mi...> - 2002-09-15 06:08:22
|
Luke Dunstan wrote: > > From: "Earnie Boyd" <ear...@ya...> > > > Igor Gnip wrote: > > > > > > some projects I use assume alloca() function is declared in stdlib.h > > > > > > now I see there is NO DEFINITION of alloca() anywhere in > > > mingw/include/* > > > > > > Is alloca() POSIX, ansi ? > > > > The real question to ask is, does MSVCRT.DLL include an alloca? Anyone > > know? > > > > > How can I emulate it ? > > > > It's a builtin function for GCC, just use it. Using mingw gcc-3.1, this program int main() {alloca(3); return 0} compiles and links with gcc, although with g++ it gives `alloca' undeclared Igor, are you compiling with g++? > > As far as it not being in a header file, I will add this to my round > > tuit file. For what purpose? Supporting alloca with C++? Supporting other compilers that don't have an alloca builtin? Aesthetic completeness--every function prototyped in a header? > The only thing I found on MSDN was _alloca(), which seems equivalent to > alloca(), and which is documented as being in malloc.h. However, _alloca() > does not appear in the list of exported symbols in msvcrt.dll so it is > probably built-in to the MSVC compiler or an inline assembler function (I > haven't checked an MS header yet). AFAICT alloca() is not ANSI It's not in ISO/IEC 14882 (C++98) or 9899 (C99). > so I don't > believe it needs to be in any header file. To be compatible with MSVC, we > could do something equivalent to "#define _alloca alloca" I think you mean #define alloca _alloca but it's already a builtin gcc function. You could do something for C++ only, #ifdef __GNUG__, but I fear that any macro in a header is going to produce an unpleasant surprise in some piece of existing code. Especially an alloca macro, since so much source code #defines one already. I recently tracked down just such a problem to conflicting alloca definitions. > in malloc.h unless > in strict ANSI mode (yes I hear the gasps about macros, so if an inline > function is possible then that would be good). <malloc.h> is not a standard header, and its entire contents are already guarded with #ifndef __STRICT_ANSI__ in version 1.7 of 2002-04-09T21:06:38 . But if this has to be in some header, I'd rather see it in <alloca.h>, so that there's no chance of anyone getting an alloca macro without including an alloca header. But doing nothing seems best. C programs can already use the builtin, although it's not a best practice http://www.eskimo.com/~scs/C-faq/q7.32.html and C++ programs shouldn't use alloca at all. At least with one borland compiler, there's a nasty problem: The alloca function should not be used in the try-block of a C++ program. If an exception is thrown, any values placed on the stack by alloca will be corrupted. If the calling function does not contain any references to local variables in the stack, the stack will not be restored correctly when the function exits, resulting in a program crash. On a possibly related topic, see also http://gcc.gnu.org/ml/gcc/2000-12/msg00451.html 'g++ Bug? use of alloca in a function prevents exception handler walkback on ppc linux' So if someone wants to use alloca with C++, I wouldn't want to be an enabler. It's a defect--fix the code: s/alloca/malloc/ and add a call to free(), or, better, use an RAII technique like std::auto_ptr. |
From: Igor G. <gn...@di...> - 2002-09-16 16:21:47
|
sorry, I missed your answer somehow :( Yes, I tried to use alloca() in c++ Your advice explains my problem, but I still need some good solution for alloca() replacement in c++ programs ... here is the problematic part: void TFileViewer::draw() { const char *p; char *s=(char *)alloca(size.x+1); ushort c = getColor(0x0301); for( int i = 0; i < size.y; i++ ) { TDrawBuffer b; b.moveChar( 0, ' ', c, size.x ); if( delta.y + i < fileLines->getCount() ) { p = operator[](delta.y+i); if( p == 0 || strlen(p) < (unsigned)delta.x ) s[0] = EOS; else { strncpy( s, p+delta.x, size.x ); s[size.x] = EOS; } b.moveStr( 0, s, c ); } writeBuf( 0, i, size.x, 1, b ); } } -- Igor Gnip <gn...@di...> |
From: Oscar F. <of...@wa...> - 2002-09-16 19:35:31
|
Igor Gnip <gn...@di...> writes: > sorry, I missed your answer somehow :( > > Yes, I tried to use alloca() in c++ > > Your advice explains my problem, but I still need some good solution > for alloca() replacement in c++ programs ... I think Greg Chicares said what the "solution" is: --- Quote It's a defect--fix the code: s/alloca/malloc/ and add a call to free(), or, better, use an RAII technique like std::auto_ptr. --- End Quote What's preventing you from applying his advice? [snip] -- Oscar |
From: Igor G. <gn...@di...> - 2002-09-16 21:44:15
|
> Igor Gnip <gn...@di...> writes: > > > sorry, I missed your answer somehow :( > > > > Yes, I tried to use alloca() in c++ > > > > Your advice explains my problem, but I still need some good solution > > for alloca() replacement in c++ programs ... > > I think Greg Chicares said what the "solution" is: > > --- Quote > > It's a defect--fix the code: s/alloca/malloc/ and add a call to > free(), or, better, use an RAII technique like std::auto_ptr. > > --- End Quote > > What's preventing you from applying his advice? Well I guess alloca() is simple and very fast, and malloc() is slow ... and I don't know about std:auto_ptr (I'm not very good in c++) -- Igor Gnip <gn...@di...> |
From: Oscar F. <of...@wa...> - 2002-09-16 22:31:12
|
Igor Gnip <gn...@di...> writes: > > > Yes, I tried to use alloca() in c++ > > > > > > Your advice explains my problem, but I still need some good solution > > > for alloca() replacement in c++ programs ... > > > > I think Greg Chicares said what the "solution" is: > > > > --- Quote > > > > It's a defect--fix the code: s/alloca/malloc/ and add a call to > > free(), or, better, use an RAII technique like std::auto_ptr. > > > > --- End Quote > > > > What's preventing you from applying his advice? > > Well I guess alloca() is simple and very fast, ... and not C++ > and malloc() is slow ... Yup. But there are other ways for "allocating" memory. You could use a pool, for example. > and I don't know about std:auto_ptr (I'm not very good in c++) Then, you are stuck. The simplest approach I can think off that doesn't require a decent level of C++ is char buffer[whisfullThinkingSize]; bool deallocate = false; if( requiredSize > whisfullThinkingSize ) { buffer = new char[requiredSize]; deallocate = true; } // use 'buffer'... // At function exit : if( deallocate ) delete [] buffer; Now, you set 'whisfullThinkingSize' to a value that, hopefully, will be enough for a "large enough" set of cases. For instance: const inst whishfullThinkingSize = 1000; This way you have fast memory allocation on most cases and pay some price for the rest. Please note: if you try to use "too much" stack space, your program will crash, so don't set 'whishfullThinkingSize' to large values. IIRC, the default stack size for MinGW executables is about 2 or 3 MB. I would't use the above technique on production code, but the other option you have is to learn to use RAII. If an exception occurs while you are in the middle of the function or the function exits with a 'return' before the deallocation point, and 'buffer' points to a piece of memory allocated with 'new' or 'malloc', your program will leak. -- Oscar |
From: Greg C. <chi...@mi...> - 2002-09-17 03:50:27
|
Igor Gnip wrote: > > > Igor Gnip <gn...@di...> writes: > > > > > sorry, I missed your answer somehow :( > > > > > > Yes, I tried to use alloca() in c++ > > > > > > Your advice explains my problem, but I still need some good solution > > > for alloca() replacement in c++ programs ... > > > > I think Greg Chicares said what the "solution" is: > > > > --- Quote > > > > It's a defect--fix the code: s/alloca/malloc/ and add a call to > > free(), or, better, use an RAII technique like std::auto_ptr. > > > > --- End Quote > > > > What's preventing you from applying his advice? > > Well I guess alloca() is simple and very fast, and malloc() is slow ... > and I don't know about std:auto_ptr (I'm not very good in c++) Why do you think malloc() would be too slow here? It'd be called once, outside the loop. I'd guess that the code inside the loop is slower than malloc(). Try it and see what difference it makes. > void TFileViewer::draw() > { > const char *p; > char *s=(char *)alloca(size.x+1); Here you can just substitute malloc() for alloca().... > ushort c = getColor(0x0301); > for( int i = 0; i < size.y; i++ ) > { > TDrawBuffer b; > b.moveChar( 0, ' ', c, size.x ); > if( delta.y + i < fileLines->getCount() ) > { > p = operator[](delta.y+i); > if( p == 0 || strlen(p) < (unsigned)delta.x ) > s[0] = EOS; > else > { > strncpy( s, p+delta.x, size.x ); > s[size.x] = EOS; > } > b.moveStr( 0, s, c ); > } > writeBuf( 0, i, size.x, 1, b ); > } ...and here you would free() memory allocated with malloc(). > } You can use __builtin_alloca() if you like, but that makes the code even less portable; and as mentioned before, if an exception gets thrown in the loop, bad things might happen. |
From: Igor G. <gn...@di...> - 2002-09-17 09:36:15
|
> Why do you think malloc() would be too slow here? > It'd be called once, outside the loop. I'd guess that > the code inside the loop is slower than malloc(). > Try it and see what difference it makes. Well I just have the feeling that it is not the right way I guess. Maybe you are right. I already decided to do #if __GNUC_VERSION_MAJOR == 2 #define alloca __buildin_alloca #endif so thanx anyway -- Igor Gnip <gn...@di...> |
From: Luke D. <cod...@ho...> - 2002-09-17 02:00:08
|
----- Original Message ----- From: "Igor Gnip" <gn...@di...> To: <min...@li...> Sent: Tuesday, September 17, 2002 12:19 AM Subject: Re[2]: [Mingw-users] alloca function does not exist ??? > sorry, I missed your answer somehow :( > > Yes, I tried to use alloca() in c++ > > Your advice explains my problem, but I still need some good solution for > alloca() replacement in c++ programs ... > > here is the problematic part: > > void TFileViewer::draw() > { > const char *p; > char *s=(char *)alloca(size.x+1); I found out that compiler built-in functions are disabled in GCC when compiling C++, which is why alloca() doesn't work. But you can still use alloca (see the documentation for "-fno-builtin"): char *s = (char *)__builtin_alloca(size.x + 1); You can define a macro like ALLOCA so that your code will be compatible with other compilers (but remember alloca() isn't standard anyway). If your program only needs to compile with GCC you could also use a variable-sized array: char s[size.x + 1]; This is a GCC extension so it is not recommended, but all options are worth considering. > ushort c = getColor(0x0301); > for( int i = 0; i < size.y; i++ ) > { > TDrawBuffer b; > b.moveChar( 0, ' ', c, size.x ); > if( delta.y + i < fileLines->getCount() ) > { > p = operator[](delta.y+i); > if( p == 0 || strlen(p) < (unsigned)delta.x ) > s[0] = EOS; > else > { > strncpy( s, p+delta.x, size.x ); > s[size.x] = EOS; > } > b.moveStr( 0, s, c ); > } > writeBuf( 0, i, size.x, 1, b ); > } > } > > -- > Igor Gnip <gn...@di...> Luke Dunstan |