У меня есть рекурсивная функция, которая объявляет не менее 50 КБ локальных переменных в одном вызове, и переполнение стека может быть вероятным с количеством рекурсивных шагов, которые мне понадобятся. Однако, к тому времени, когда функция вызывается внутри себя, эти переменные больше не нужны. Могу ли я удалить их перед вызовом функции, чтобы они не могли потреблять избыточную стек памяти? Я хочу избежать использования памяти из кучи.Удаление избыточных переменных из стека - C++
ответ
Если необходимо использование рекурсии, а затем положить эти перерабатываемые переменные внутри struct
, и передать этот многоразовый struct
экземпляр (инстанцированный на внешнем слое рекурсии) путем ссылки на ваши рекурсивных вызовов.
int function(int c) {
...
// Use anonymous parentheses to scope stack variables
{
int a = ...;
int b = ...;
c = ...;
}
...
return function(c);
}
Это почти наверняка НЕ работает. –
@ Матс Петерсон, почему бы и нет? –
Поскольку компиляторы обычно не выполняют множественные распределения стека в одной функции - это пустая трата усилий, так как выделение пространства на стеке выполняется в одной команде в противном случае и делает доступ к локальным переменным в рамках каждой области спектра. Конструкторы и деструкторы вызываются в пределах определенного объема, но пространство собрано, сделанное при входе и выходе. Попробуйте посмотреть код, сгенерированный компилятором, если вы мне не верите ... [Я работал с gcc, clang, MSVC, High-C, CAD-UL C, Turbo C и armcc, и я никогда не видел стек deallocation в середине функции] –
Есть несколько возможных решений, наиболее вероятным является, в некотором роде, удалить этот блок переменных из стека, либо путем передачи его в от более низкого уровня (и, таким образом, повторного использования и то же пространства), или используя динамическое распределение какого-либо вида.
Или разделить функции, такие, что распределение 50kb то возвращается, прежде чем сделать рекурсивный вызов, что-то вроде этого:
int do_stuff_on_stack()
{
large variable;
...
}
int recursive_call()
{
int x = do_stuff_on_stack();
if (something)
int y = recursive_call();
}
- 1. Удаление объекта из стека?
- 2. Python: удаление избыточных строк из сценария
- 3. Удаление избыточных с помощью операторов
- 4. Удаление строк из стека в C
- 5. Удаление активность из стека
- 6. Удаление активности из стека
- 7. удаление чисел из стека?
- 8. Удаление избыточных тестов JUnit testuite
- 9. Удаление переменной стека в C++
- 10. Удаление переменных из массива()
- 11. Удаление переменных из массива
- 12. Удаление активности из стека истории
- 13. Удаление SurfaceView из стека приложений
- 14. Удаление избыточных средних пространств в имени - SQL
- 15. Удаление неиспользуемых переменных из jQuery
- 16. Извлечение избыточных записей перечисленных элементов, содержащихся в переменных переменных
- 17. Удаление избыточных реализаций интерфейса без использования наследования
- 18. Удаление избыточных запросов с использованием активной записи
- 19. Удаление избыточных записей в журнале доступа
- 20. Незаконное удаление объекта стека
- 21. Пандас Dataframe: Удаление избыточных строк в заголовках
- 22. Удаление избыточных разрывов строк с регулярными выражениями
- 23. Адресация переменных стека
- 24. Распечатка переменных объектов класса из стека
- 25. Заказ переменных стека gcc
- 26. Определение переменных стека или кучи в C?
- 27. Удаление переменных из файла .mat
- 28. Удаление нежелательных переменных
- 29. Удаление диспетчеров просмотра из навигационного стека
- 30. Android: Удаление всех предыдущих действий из стека
звучит как вам не нужна рекурсия ... почему бы не сделать это итеративным вместо ? –
Я не уверен, что это не ответ, но включит ли их (и их использование) в фигурные скобки, чтобы они были удалены до рекурсивного вызова? –
Если вы * должны * сделать его рекурсивным, попробуйте сделать его хвостовым рекурсивным, и компилятор сможет его оптимизировать. –