Цитата(_Pasha @ Dec 27 2012, 19:08)

alloca() и еще связным списком попахивает

Так что лучше с размером-сразу.
Я же написал -- в GCC для примера выше код с alloca и с C99-массивом переменного размера
одинаков. alloca был придуман именно для того, чтобы для "динамической" памяти, которая освобождается в той же функции, в которой выделялась, уйти от списков и фрагментации. Ценой необходимости запаса не стеке. В некотором смысле C99-массивы переменной длины — это синтаксический сахар над alloca. Ну или alloca -- предшественник этих массивов.
Цитата
NAME
alloca - allocate memory that is automatically freed
SYNOPSIS
#include <alloca.h>
void *alloca(size_t size);
DESCRIPTION
The alloca() function allocates size bytes of space in the stack frame
of the caller. This temporary space is automatically freed when the
function that called alloca() returns to its caller.
Никакие списки тут не нужны.
Код
#include <alloca.h>
void moo(int *p);
void foo(int i, int j)
{
if (i > 0) {
int *p = alloca(i);
moo(p);
}
if (j > 0) {
int *p = alloca(2*j);
moo(p);
}
}
Код
foo:
@ args = 0, pretend = 0, frame = 0
@ frame_needed = 1, uses_anonymous_args = 0
push {r3, r4, r7, lr}
cmp r0, #0
add r7, sp, #0
mov r4, r1
ble .L2
adds r0, r0, #14
bic r0, r0, #7
sub sp, sp, r0; выделили первый запрос
mov r0, sp
bl moo
.L2:
cmp r4, #0
ble .L1
lsls r4, r4, #1
adds r4, r4, #14
bic r4, r4, #7
sub sp, sp, r4; выделили второй запрос
mov r0, sp
bl moo
.L1:
mov sp, r7; освобождаем одним махом всё (если вообще выделяли)
pop {r3, r4, r7, pc}