Как изменить размер стека

I had asked this question couple days ago but It did not solve my problem. I cannot increase stack size in Visual Studio, I am using recursive method which gets high input and it causes to stack ov...

I had asked this question couple days ago but It did not solve my problem. I cannot increase stack size in Visual Studio, I am using recursive method which gets high input and it causes to stack overflow. I cannot use vector or something else. What I need is to increase stack size in c++, Visual Studio.

P.S. I increased stack reserve size from Visual Studio configuration, however, it does not also solve my problem.

void sorting:: MergeSort(int *theArray, int n) {


    mergesort(theArray, 0, n - 1);

}
void sorting::mergesort(int *theArray, int first, int last) {
    if (first < last) {

        int mid = (first + last) / 2;   // index of midpoint

        mergesort(theArray, first, mid);

        mergesort(theArray, mid + 1, last);

        // merge the two halves
        merge(theArray, first, mid, last);
    }
}  // end mergesort
void sorting::merge(int* theArray, int first, int mid, int last) {
    const int max_size = 500000;
    int tempArray[max_size];
    int first1 = first;     // beginning of first subarray
    int last1 = mid;        // end of first subarray
    int first2 = mid + 1;   // beginning of second subarray
    int last2 = last;       // end of second subarray
    int index = first1; // next available location in tempArray

    for (; (first1 <= last1) && (first2 <= last2); ++index) {
        if (theArray[first1] < theArray[first2]) {
            tempArray[index] = theArray[first1];
            ++first1;
        }
        else {
            tempArray[index] = theArray[first2];
            ++first2;
        }
    }
    // finish off the first subarray, if necessary
    for (; first1 <= last1; ++first1, ++index)
        tempArray[index] = theArray[first1];

    // finish off the second subarray, if necessary
    for (; first2 <= last2; ++first2, ++index)
        tempArray[index] = theArray[first2];

    // copy the result back into the original array
    for (index = first; index <= last; ++index)
        theArray[index] = tempArray[index];
    delete[] tempArray;
}  // end merge

And my main function.

  #include <iostream>
    #include <ctime>
    #include "sorting.h"

    using namespace std;



    int main()
    {
        sorting sort;
        int size = 500000;
        int *myArr=new int[size];

        for (int i = 0; i < size; i++) {
            myArr[i] = rand() % size;
        }
        cout << clock()<<"   ";
        sort.MergeSort(myArr,size);
        cout<<clock();
        cin.get();
    }

I have a program that does recursive calls for 2 billion times and the stack overflow. I make changes, and then it still need 40K recursive calls. So I need probably several MB stack memory. I heard the stack size is default to 1MB. I tried search online. Some one said to go properties ->linker ………in visual studio, but I cannot find it.

Does anybody knows how to increase it? Also I am wondering if I can set it somewhere in my C# program?

P.S. I am using 32-bit winXP and 64bit win7.

BenMorel's user avatar

BenMorel

33.5k49 gold badges174 silver badges310 bronze badges

asked Mar 31, 2010 at 22:31

Frank's user avatar

0

The easiest way to set the stack size from .NET 2.0 and Win XP onwards is to spawn a new thread with the stack size you’d like:-

using System.Threading;

Thread T = new Thread(threadDelegate, stackSizeInBytes);
T.Start();

To change the stack size of the entire program you’d have to use editbin:-

EDITBIN.EXE /STACK:<stacksize> file.exe

answered Mar 31, 2010 at 22:38

Andrew O'Reilly's user avatar

4

There is no compiler option to do it. You can edit it after the fact using editbin /stack, or create a separate thread for your algorithm, and specify a larger stack size in the Thread constructor.

That being said, you may want to flatten your recursive function… If you’re having stack overflows now, it’s tough to know that any stack size will be appropriate in the long term. This is just a band-aid solution.

answered Mar 31, 2010 at 22:37

Reed Copsey's user avatar

Reed CopseyReed Copsey

548k78 gold badges1144 silver badges1366 bronze badges

Most likely you should try to use loops instead of recursion.

answered Mar 31, 2010 at 22:36

John Boker's user avatar

John BokerJohn Boker

82k17 gold badges96 silver badges130 bronze badges

1

I know that in VS you can set an arbitrary stack size (EDIT: For C++ programs). However, I’d suggest that you use a tail call (i.e., return MyFunc(args); ) which automatically recycles stack space. Then, you’d use some heap-allocated object to hold state.

answered Mar 31, 2010 at 23:23

Puppy's user avatar

PuppyPuppy

144k36 gold badges252 silver badges457 bronze badges

1

I have a program that does recursive calls for 2 billion times and the stack overflow. I make changes, and then it still need 40K recursive calls. So I need probably several MB stack memory. I heard the stack size is default to 1MB. I tried search online. Some one said to go properties ->linker ………in visual studio, but I cannot find it.

Does anybody knows how to increase it? Also I am wondering if I can set it somewhere in my C# program?

P.S. I am using 32-bit winXP and 64bit win7.

BenMorel's user avatar

BenMorel

33.5k49 gold badges174 silver badges310 bronze badges

asked Mar 31, 2010 at 22:31

Frank's user avatar

0

The easiest way to set the stack size from .NET 2.0 and Win XP onwards is to spawn a new thread with the stack size you’d like:-

using System.Threading;

Thread T = new Thread(threadDelegate, stackSizeInBytes);
T.Start();

To change the stack size of the entire program you’d have to use editbin:-

EDITBIN.EXE /STACK:<stacksize> file.exe

answered Mar 31, 2010 at 22:38

Andrew O'Reilly's user avatar

4

There is no compiler option to do it. You can edit it after the fact using editbin /stack, or create a separate thread for your algorithm, and specify a larger stack size in the Thread constructor.

That being said, you may want to flatten your recursive function… If you’re having stack overflows now, it’s tough to know that any stack size will be appropriate in the long term. This is just a band-aid solution.

answered Mar 31, 2010 at 22:37

Reed Copsey's user avatar

Reed CopseyReed Copsey

548k78 gold badges1144 silver badges1366 bronze badges

Most likely you should try to use loops instead of recursion.

answered Mar 31, 2010 at 22:36

John Boker's user avatar

John BokerJohn Boker

82k17 gold badges96 silver badges130 bronze badges

1

I know that in VS you can set an arbitrary stack size (EDIT: For C++ programs). However, I’d suggest that you use a tail call (i.e., return MyFunc(args); ) which automatically recycles stack space. Then, you’d use some heap-allocated object to hold state.

answered Mar 31, 2010 at 23:23

Puppy's user avatar

PuppyPuppy

144k36 gold badges252 silver badges457 bronze badges

1

I have a program that does recursive calls for 2 billion times and the stack overflow. I make changes, and then it still need 40K recursive calls. So I need probably several MB stack memory. I heard the stack size is default to 1MB. I tried search online. Some one said to go properties ->linker ………in visual studio, but I cannot find it.

Does anybody knows how to increase it? Also I am wondering if I can set it somewhere in my C# program?

P.S. I am using 32-bit winXP and 64bit win7.

BenMorel's user avatar

BenMorel

33.5k49 gold badges174 silver badges310 bronze badges

asked Mar 31, 2010 at 22:31

Frank's user avatar

0

The easiest way to set the stack size from .NET 2.0 and Win XP onwards is to spawn a new thread with the stack size you’d like:-

using System.Threading;

Thread T = new Thread(threadDelegate, stackSizeInBytes);
T.Start();

To change the stack size of the entire program you’d have to use editbin:-

EDITBIN.EXE /STACK:<stacksize> file.exe

answered Mar 31, 2010 at 22:38

Andrew O'Reilly's user avatar

4

There is no compiler option to do it. You can edit it after the fact using editbin /stack, or create a separate thread for your algorithm, and specify a larger stack size in the Thread constructor.

That being said, you may want to flatten your recursive function… If you’re having stack overflows now, it’s tough to know that any stack size will be appropriate in the long term. This is just a band-aid solution.

answered Mar 31, 2010 at 22:37

Reed Copsey's user avatar

Reed CopseyReed Copsey

548k78 gold badges1144 silver badges1366 bronze badges

Most likely you should try to use loops instead of recursion.

answered Mar 31, 2010 at 22:36

John Boker's user avatar

John BokerJohn Boker

82k17 gold badges96 silver badges130 bronze badges

1

I know that in VS you can set an arbitrary stack size (EDIT: For C++ programs). However, I’d suggest that you use a tail call (i.e., return MyFunc(args); ) which automatically recycles stack space. Then, you’d use some heap-allocated object to hold state.

answered Mar 31, 2010 at 23:23

Puppy's user avatar

PuppyPuppy

144k36 gold badges252 silver badges457 bronze badges

1

I have a program that does recursive calls for 2 billion times and the stack overflow. I make changes, and then it still need 40K recursive calls. So I need probably several MB stack memory. I heard the stack size is default to 1MB. I tried search online. Some one said to go properties ->linker ………in visual studio, but I cannot find it.

Does anybody knows how to increase it? Also I am wondering if I can set it somewhere in my C# program?

P.S. I am using 32-bit winXP and 64bit win7.

BenMorel's user avatar

BenMorel

33.5k49 gold badges174 silver badges310 bronze badges

asked Mar 31, 2010 at 22:31

Frank's user avatar

0

The easiest way to set the stack size from .NET 2.0 and Win XP onwards is to spawn a new thread with the stack size you’d like:-

using System.Threading;

Thread T = new Thread(threadDelegate, stackSizeInBytes);
T.Start();

To change the stack size of the entire program you’d have to use editbin:-

EDITBIN.EXE /STACK:<stacksize> file.exe

answered Mar 31, 2010 at 22:38

Andrew O'Reilly's user avatar

4

There is no compiler option to do it. You can edit it after the fact using editbin /stack, or create a separate thread for your algorithm, and specify a larger stack size in the Thread constructor.

That being said, you may want to flatten your recursive function… If you’re having stack overflows now, it’s tough to know that any stack size will be appropriate in the long term. This is just a band-aid solution.

answered Mar 31, 2010 at 22:37

Reed Copsey's user avatar

Reed CopseyReed Copsey

548k78 gold badges1144 silver badges1366 bronze badges

Most likely you should try to use loops instead of recursion.

answered Mar 31, 2010 at 22:36

John Boker's user avatar

John BokerJohn Boker

82k17 gold badges96 silver badges130 bronze badges

1

I know that in VS you can set an arbitrary stack size (EDIT: For C++ programs). However, I’d suggest that you use a tail call (i.e., return MyFunc(args); ) which automatically recycles stack space. Then, you’d use some heap-allocated object to hold state.

answered Mar 31, 2010 at 23:23

Puppy's user avatar

PuppyPuppy

144k36 gold badges252 silver badges457 bronze badges

1

На контестах довольно часто встречаются задачи, требующие применения глубокой рекурсии. Обычно это задачи на графы с большими ограничениями, решение которых использует поиск в глубину. А глубокая рекурсия требует большого размера доступного стека, часто несколько мегабайт.
В таких языках программирования, как C++ или Pascal/Delphi, размер стека можно установить с помощью директив компилятору. Однако в Java это сделать нельзя. Размер стека, выделяемый потоку Java по умолчанию, весьма мал, на 32-битной Windows всего 320kb. Самым простым способом установить размер стека для потока Java является использование ключа командой строки -Xss для JVM. Вот тут-то и начинаются проблемы.
Во-первых, об этом нужно знать) Практика показывает, что плохое представление о Java имеют не только низкоуровневые соревнования (Западно-Сибирский четвертьфинал ACM ICPC), но и вполне приличные архивы задач, например, TJU. В результате приходится писать либо нерекурсивный dfs, что не всегда тривиально и всегда лениво, либо писать/переписывать на C++, что просто печально.
Во-вторых, недостатки имеет сам ключ -Xss. При его использовании указанный размер стека выделяется всем потоками приложения. Для простого однопоточного приложения это не страшно, однако это может создать проблемы для тестирующей системы, если в ней одновременно могут выполняться много потоков Java.
Кроме того, возникает вопрос неучтенной памяти — если тестирующая выставляет ограничение по памяти с помощью ключа -Xmx, то программа, вообще говоря, может использовать больше памяти — добавляется стек. Поэтому контроль проверки на Memory Limit Exceeded с помощью перехватывания OutOfMemoryError будет работать не совсем корректно.
Стоит, однако, сказать, что эти недостатки вполне себе преспокойно игнорируются. Стандартная командная строка запуска jvm вида
  java -Xmx<?>М -Xss<?>M <class name>
используется на NEERC, что указано в раздаваемых перед контестом правилах (хотя об этом почему-то ничего нет на официальном сайте), на Timus и на петрозаводских сборах. Есть также подозрения, что что-то подобное используется на финале ACM ICPC, хотя опять же, только по словам на Q&A Session.
В-третьих, до Java 1.6 эта установка использовалась только во вновь созданных потоках, в то время как main thread использовал стандартный для ОС размер стека. Поэтому  приходилось писать в main-методе что-то вроде

        new Thread() {
            public void run() {
              new Main().run();
            }
        }.start();

С появлением 1.6 это стало не нужно, и я уже начал забывать о всех беспокойствах, связанных со стеком. Но тут появился Codeforces.
Не увидев в описании компиляторов нужных параметров, я поспешил написать коммент. Какого же было моё удивление, когда MikeMirzayanov ответил, что «Правильно запускать новый Thread с нужным размером стека и в нем осуществлять решение задачи». Я всю жизнь думал, что этого сделать нельзя) Но, посмотрев JavaDoc (почему я не сделал этого раньше?), я нашел такой вот замечательный конструктор у Thread:

public Thread(ThreadGroup group,
              Runnable target,
              String name,
              long stackSize).

Правда, в том же JavaDoc несколько раз было написано о том, что как будет использоваться параметр stackSize и будет ли использоваться вообще, зависит от системы. Тем не менее, проверка показала, что стек действительно выставляется, и не только на Codeforces, но и на TJU. В результате приходим к такому прекрасному оператору в main:

        new Thread(null, new Runnable() {
            public void run() {
                new Main().run();
            }
        }, "1", 1 << 23).start();

который устанавливает размер стека в 8 МБ для потока «1».
Может быть, у вас возникали какие-то еще проблемы со стеком или вы знаете другие способы его установить? Пишите в комментах)

Понравилась статья? Поделить с друзьями:

Читайте также:

  • Как изменить размер спецсимволы html
  • Как изменить размер сосков
  • Как изменить размер снимка
  • Как изменить размер слоя гимп
  • Как изменить размер слоя after effects

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии