Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 24 Feb 2013 13:24:36 -0800
From:      Jeremy Chadwick <jdc@koitsu.org>
To:        Ian Lepore <ian@FreeBSD.org>
Cc:        Michael Ross <gmx@ross.cx>, freebsd-stable@FreeBSD.org, John Mehr <jcm@visi.com>
Subject:   Re: svn - but smaller?
Message-ID:  <20130224212436.GA13670@icarus.home.lan>
In-Reply-To: <1361726397.16937.4.camel@revolution.hippie.lan>
References:  <1359380582-6256705.77592125.fr0SDgrYH000991@rs149.luxsci.com> <web-10502111@mailback3.g2host.com> <web-12014638@mailback4.g2host.com> <op.wszomvfyg7njmm@michael-think> <20130224031509.GA47838@icarus.home.lan> <op.wszrv9k5g7njmm@michael-think> <20130224041638.GA51493@icarus.home.lan> <op.wszt3wh2g7njmm@michael-think> <20130224063110.GA53348@icarus.home.lan> <1361726397.16937.4.camel@revolution.hippie.lan>

next in thread | previous in thread | raw e-mail | index | archive | help
On Sun, Feb 24, 2013 at 10:19:57AM -0700, Ian Lepore wrote:
> On Sat, 2013-02-23 at 22:31 -0800, Jeremy Chadwick wrote:
> > 
> > Also, John, please consider using malloc(3) instead of heap-allocated
> > buffers like file_buffer[6][] (196608 bytes) and command[] (32769
> > bytes).  I'm referring to this: 
> 
> Why?  I absolutely do not understand why people are always objecting to
> large stack-allocated arrays in userland code (sometimes with the
> definition of "large" being as small as 2k for some folks).

This is incredibly off-topic, but I'll bite.

I should not have said "heap-allocated", I was actually referring to
statically-allocated.

The issues as I see them:

1. Such buffers exist during the entire program's lifetime even if they
aren't actively used/needed by the program.  With malloc(3) and friends,
you're allocating memory dynamically, and you can free(3) when done with
it, rather than just having a gigantic portion of memory allocated
sitting around potentially doing nothing.

2. If the length of the buffer exceeds the amount of stack space
available at the time, the program will run but the behaviour is unknown
(I know that on FreeBSD if it exceeds "stacksize" per resource limits,
the program segfaults at runtime).  With malloc and friends you can
gracefully handle allocation failures.

3. Statically-allocated buffers can't grow; meaning what you've
requested size-wise is all you get.  Compare this to something that's
dynamic -- think a linked list containing pointers to malloc'd memory,
which can even be realloc(3)'d if needed.

The definition of what's "too large" is up to the individual and the
limits of the underlying application.  For some people, sure, anything
larger than 2048 might warrant use of malloc.  I tend to use malloc for
anything larger than 4096.  That "magic number" comes from some piece of
information I was told long ago about what size pages malloc internally
uses, but looking at the IMPLEMENTATION NOTES section in malloc(3) it
appears to be a lot more complex than that.

If you want me to break down #1 for you with some real-world output and
a very small C program, showing you the effects on RES/RSS and SIZE/VIRT
of static vs. dynamic allocation, just ask.

-- 
| Jeremy Chadwick                                   jdc@koitsu.org |
| UNIX Systems Administrator                http://jdc.koitsu.org/ |
| Mountain View, CA, US                                            |
| Making life hard for others since 1977.             PGP 4BD6C0CB |



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20130224212436.GA13670>