2015-03-12 3 views
0

У меня есть рекурсивная функция, которая объявляет не менее 50 КБ локальных переменных в одном вызове, и переполнение стека может быть вероятным с количеством рекурсивных шагов, которые мне понадобятся. Однако, к тому времени, когда функция вызывается внутри себя, эти переменные больше не нужны. Могу ли я удалить их перед вызовом функции, чтобы они не могли потреблять избыточную стек памяти? Я хочу избежать использования памяти из кучи.Удаление избыточных переменных из стека - C++

+1

звучит как вам не нужна рекурсия ... почему бы не сделать это итеративным вместо ? –

+1

Я не уверен, что это не ответ, но включит ли их (и их использование) в фигурные скобки, чтобы они были удалены до рекурсивного вызова? –

+1

Если вы * должны * сделать его рекурсивным, попробуйте сделать его хвостовым рекурсивным, и компилятор сможет его оптимизировать. –

ответ

2

Если необходимо использование рекурсии, а затем положить эти перерабатываемые переменные внутри struct, и передать этот многоразовый struct экземпляр (инстанцированный на внешнем слое рекурсии) путем ссылки на ваши рекурсивных вызовов.

1
int function(int c) { 
    ... 

    // Use anonymous parentheses to scope stack variables 
    { 
     int a = ...; 
     int b = ...; 
     c = ...; 
    } 
    ... 

    return function(c); 
} 
+2

Это почти наверняка НЕ ​​работает. –

+1

@ Матс Петерсон, почему бы и нет? –

+0

Поскольку компиляторы обычно не выполняют множественные распределения стека в одной функции - это пустая трата усилий, так как выделение пространства на стеке выполняется в одной команде в противном случае и делает доступ к локальным переменным в рамках каждой области спектра. Конструкторы и деструкторы вызываются в пределах определенного объема, но пространство собрано, сделанное при входе и выходе. Попробуйте посмотреть код, сгенерированный компилятором, если вы мне не верите ... [Я работал с gcc, clang, MSVC, High-C, CAD-UL C, Turbo C и armcc, и я никогда не видел стек deallocation в середине функции] –

2

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

Или разделить функции, такие, что распределение 50kb то возвращается, прежде чем сделать рекурсивный вызов, что-то вроде этого:

int do_stuff_on_stack() 
{ 
    large variable; 
    ... 
} 


int recursive_call() 
{ 
    int x = do_stuff_on_stack(); 

    if (something) 
     int y = recursive_call(); 
} 
Смежные вопросы