Динамическое выделение стека в C ++ - PullRequest
3 голосов
/ 21 мая 2010

Я хочу выделить память в стеке.

Слышал о _alloca / alloca, и я понимаю, что это специфичные для компилятора вещи, которые мне не нравятся.

Итак, я придумал собственное решение (которое может иметь свои недостатки) и хочу, чтобы вы пересмотрели / улучшили его, так что раз и навсегда у нас будет работать этот код:

/*#define allocate_on_stack(pointer, size) \
    __asm \
    { \
        mov [pointer], esp; \
        sub esp, [size]; \
    }*/
/*#define deallocate_from_stack(size) \
    __asm \
    { \
        add esp, [size]; \
    }*/

void test()
{
    int buff_size = 4 * 2;
    char *buff = 0;

    __asm
    { // allocate
        mov [buff], esp;
        sub esp, [buff_size];
    }

    // playing with the stack-allocated memory
    for(int i = 0; i < buff_size; i++)
        buff[i] = 0x11;

    __asm
    { // deallocate
        add esp, [buff_size];
    }
}

void main()
{
    __asm int 3h;
    test();
}

Скомпилировано с VC9.

Какие недостатки вы видите в этом? Я, например, не уверен, что вычитание из ESP является решением для "любого вида процессора". Кроме того, я бы хотел, чтобы закомментированные макросы работали, но по некоторым причинам я не могу.

Ответы [ 3 ]

8 голосов
/ 21 мая 2010

Извините, но вам лучше использовать alloca, чем делать подобные вещи. Он не только специфичен для x86, но и, вероятно, даст неожиданные результаты, если будет скомпилирован с оптимизацией.

alloca поддерживается многими компиляторами, поэтому у вас не должно быть проблем в ближайшее время.

3 голосов
/ 21 мая 2010

Ваше решение более зависит от платформы, чем alloca (оно не будет работать на x64).Существует стандартный и достаточно быстрый способ выделения памяти.Вы можете предварительно выделить большой блок памяти и самостоятельно управлять распределением памяти.Взгляните на Boost Pool Library

1 голос
/ 21 мая 2010

Не определять deallocate_from_stack. Как реализовано, deallocate_from_stack, скорее всего, будет делать то, что вы ожидаете, если вызывается сразу после allocate_from_stack, а может быть, даже не тогда. Кроме того, весь смысл распределения стека состоит в том, чтобы не вызывать free или любой другой эквивалент.

Макрос allocate мне подходит нормально, хотя, как отмечали другие, он работает только на x86 (что заставляет вас беспокоиться о «любом виде процессора»).

...