Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.73
SEVI
31 / 30 / 0
Регистрация: 26.01.2010
Сообщений: 124
Записей в блоге: 1
#1

"Stack overflow" как обойти? - C++

27.01.2014, 00:17. Просмотров 1552. Ответов 40
Метки нет (Все метки)

Доброго времени суток!
Дело в том, что при объявлении массива размером 106
C++
1
int a[1000000];
выскакивает при запуске (после компиляции даже) stack overflow, еще до того как туда будут заноситься элементы. Дебаггер указывает именно сюда... Тем более если сделать 105, то все работает... Прошу объяснить как это обойти... Заранее спасибо.
Вот весь код (без кода функции двоичной сортировки quickSortR)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int main()
{
    int n, k, i, s=0;
    int a[100000];
    ifstream f1("E.dat");
    ofstream f2("E.sol");
    f1 >> n >> k;
    for (i = 0; i < n; i++) {
        f1 >> a[i];
    }
    quickSortR(a,n-1);
    for (i = k; i < n; i++) {
        s = s + a[i];
    }
    f2 << s;
}
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.01.2014, 00:17
Здравствуйте! Я подобрал для вас темы с ответами на вопрос "Stack overflow" как обойти? (C++):

Ошибка "stack overflow". Разложение функции в ряд Тейлора - C++
Задание: рекурентно реализовать разложение ф-ии {\sin}^{2} по ряду Тэйлора. Выдает ошибку &quot;Необработанное исключение в &quot;0x00cc18a9&quot; в...

Быстрая сортировка: ошибка "Stack overflow" - C++
Не понмаю, пишет STACK OVERFLOUDED!!!! не знаю в чем проблема. #include &lt;iostream&gt; #include &lt;locale.h&gt; #include &lt;time.h&gt; using...

Ошибка: "Unhandled exception: Stack cookie instrumentation code detected a stack-based buffer overrun" - C++
Не могу понять почему значение ChoiceOfPlayer меняется и почему NumberOfRow и NumberOfColumn всегда последние значение цикла. Помогите...

Как отследить ошибку "Stack around the variable was corrupted."? - C++
Вообщем код большой. Несколько классов, десяток функций. Ошибка всплывает только после завершения функции main(). Вот как бы научить...

В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло", "жарко", "холодно", "очень холодно" - C++
В зависимости от времени года &quot;весна&quot;, &quot;лето&quot;, &quot;осень&quot;, &quot;зима&quot; определить погоду &quot;тепло&quot;, &quot;жарко&quot;, &quot;холодно&quot;, &quot;очень холодно&quot;. Я так...

Чтение файла с данными типа real. Тип real в билдере или как его "обойти"? - C++
Читаю файл в структуру, double Fdat; struct STR { ... } rec

40
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
27.01.2014, 19:38 #31
Цитата Сообщение от h8er Посмотреть сообщение
Что этим куском коды вы хотели доказать, я так и не понял, но я хотел донести всего лишь мысль, что для доступа к ячейки на стеке в общих чертах требуется один такт, для кучи - 2. Вот и вся моя мысль.
Это код на ассемблере, видно же что одинаково по тактам
0
h8er
15 / 15 / 5
Регистрация: 20.11.2013
Сообщений: 92
27.01.2014, 19:47 #32
Цитата Сообщение от mustimur Посмотреть сообщение
Это код на ассемблере, видно же что одинаково по тактам
Ну да, точно же, а адреса в этих регистрах всю жизнь были.
В общем, я просто хотел обратить внимание на то, что доступ к SS:SP был бы быстрее, чем к записи смещения для кучи в регистр и только потом чтения адреса оттуда, и просто поинтересовался, почему же в таком случае не делают просто шире стек. И ни с кем спорить вообще-то не планировал.
0
ValeryS
Модератор
6679 / 5088 / 476
Регистрация: 14.02.2011
Сообщений: 17,086
27.01.2014, 19:54 #33
Цитата Сообщение от h8er Посмотреть сообщение
но я хотел донести всего лишь мысль, что для доступа к ячейки на стеке в общих чертах требуется один такт, для кучи - 2.
не надо в общих чертах давай конкретно
Цитата Сообщение от h8er Посмотреть сообщение
Ну да, точно же, а адреса в этих регистрах всю жизнь были.
т.е в регистр ebp , который используется для стековых переменных,адреса всегда лежат?
сколько тактов занимает такая вот например команда
lea eax,[esi+4*ecx]?????????
0
h8er
15 / 15 / 5
Регистрация: 20.11.2013
Сообщений: 92
27.01.2014, 20:05 #34
Цитата Сообщение от ValeryS Посмотреть сообщение
т.е в регистр ebp , который используется для стековых переменных,адреса всегда лежат?
Вообще-то это был сарказм, очевидно стоило бы это написать в скобочках.

Цитата Сообщение от ValeryS Посмотреть сообщение
lea eax,[esi+4*ecx]
Ну вот видите, вы уже на одну команду больше тратите, для того, чтобы загрузить сначала адрес в eax.
0
ValeryS
Модератор
6679 / 5088 / 476
Регистрация: 14.02.2011
Сообщений: 17,086
27.01.2014, 20:17 #35
Цитата Сообщение от h8er Посмотреть сообщение
Ну вот видите, вы уже на одну команду больше тратите, для того, чтобы загрузить сначала адрес в eax.
ты кроме 8086 процессора более старшие знаешь?
растактовку можешь по командам дать?
или просто так говоришь?
так кстати и не ответил сколько тактов занимает команда?

Добавлено через 4 минуты
кстати так ради смеха я не адрес записал
а рассчитал значение ecx умноженное на 5 ( для этого правда значения из ecx в esi надо скопировать)
0
h8er
15 / 15 / 5
Регистрация: 20.11.2013
Сообщений: 92
27.01.2014, 20:25 #36
Цитата Сообщение от ValeryS Посмотреть сообщение
ты кроме 8086 процессора более старшие знаешь?
растактовку можешь по командам дать?
или просто так говоришь?
так кстати и не ответил сколько тактов занимает команда?

Добавлено через 4 минуты
кстати так ради смеха я не адрес записал
а рассчитал значение ecx умноженное на 5 ( для этого правда значения из ecx в esi надо скопировать)
Что вы ко мне пристали? Вы что-то конкретное хотите от меня?
Все что я хотел сказать по этому поводу, я сказал, что вы мне пытаетесь сейчас доказать - ума не приложу. Какие-то куски псевдо асм кода кидаете не понятные, откуда-то с потолка взятые.
По поводу тактов - да погорячился, назвав их тактами, но я имел ввиду именно шаги обращения, команды, если хотите.
И причем тут 8086? Мы разве об архитектуре речь ведем или о том, что для доступа к памяти на стеке нужно всего лишь к sp обратиться, а к куче - сначала получить адрес, а потом с ним работать? Не понимаю ваших претензий, честное слово.
0
ValeryS
Модератор
6679 / 5088 / 476
Регистрация: 14.02.2011
Сообщений: 17,086
27.01.2014, 20:44 #37
Цитата Сообщение от h8er Посмотреть сообщение
. Какие-то куски псевдо асм кода кидаете не понятные, откуда-то с потолка взятые.
хочешь реальный листинг?
могу
Цитата Сообщение от h8er Посмотреть сообщение
для доступа к памяти на стеке нужно всего лишь к sp обратиться,
а сформировать переменные, тот же массив не надо? или это не считается ?
Цитата Сообщение от h8er Посмотреть сообщение
к куче - сначала получить адрес, а потом с ним работать?
откуда получить?
он или передается в функцию или возвращается new
а дальше работа по эффективности не отличается от стека
или ты думаешь что адрес где то сидит мы его взяли добавили смешение считали значения
для другого все заново повторили?
так что утверждение что работа с кучей медленней чем работа со стеком, тем более в два раза, ложное
0
castaway
Эксперт С++
4885 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
27.01.2014, 20:45 #38
Раз уж начали офтопить и холиварить..
Цитата Сообщение от ValeryS Посмотреть сообщение
для этого правда значения из ecx в esi надо скопировать
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <cstdio>
 
int main()
{
    register int r;
    __asm__ __volatile__ (
        "       .intel_syntax noprefix  \n"
        "mov    eax, 3                  \n"
        "lea    eax, [eax + eax * 4]    \n"
        "       .att_syntax             \n" : "=a" (r) );
    printf( "%d\n", r ); // 15
}
Я к тому, что можно не копировать..
0
h8er
15 / 15 / 5
Регистрация: 20.11.2013
Сообщений: 92
27.01.2014, 20:58 #39
Цитата Сообщение от ValeryS Посмотреть сообщение
хочешь реальный листинг?
могу

а сформировать переменные, тот же массив не надо? или это не считается ?

откуда получить?
он или передается в функцию или возвращается new
а дальше работа по эффективности не отличается от стека
или ты думаешь что адрес где то сидит мы его взяли добавили смешение считали значения
для другого все заново повторили?
так что утверждение что работа с кучей медленней чем работа со стеком, тем более в два раза, ложное
Уф... Вот тут мысль выражена более яснее, я надеюсь.
http://answerstop.org/question/19928...eap-allocation
0
ValeryS
Модератор
6679 / 5088 / 476
Регистрация: 14.02.2011
Сообщений: 17,086
27.01.2014, 21:15 #40
Цитата Сообщение от h8er Посмотреть сообщение
Вот тут мысль выражена более яснее,
здесь идет разговор не о работе с массивом а о выделении его
I was always under the impression that growing the stack was constant time, and heap allocation's performance depended on the current complexity of the heap for both allocation (finding a hole of the proper size) and de-allocating (collapsing holes to reduce fragmentation, as many standard library implementations take time to do this during deletes if I am not mistaken).
C++
1
2
for (int i = 0; i < 100000; ++i)
        empty e;
и
C++
1
2
3
4
 for (int i = 0; i < 100000; ++i) {
        empty* e = new empty;
        delete e;
    };
разумеется выделение в куче медленней никто с этим и не спорил
но зато здесь нет ограничений (в смысле они гораздо больше чем у стека)
а в работе они практически одинаковы
в нормальной программе никто не будет создавать и удалять массив миллион раз подряд
0
h8er
15 / 15 / 5
Регистрация: 20.11.2013
Сообщений: 92
27.01.2014, 21:16 #41
Ну и отлично.
0
27.01.2014, 21:16
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.01.2014, 21:16
Привет! Вот еще темы с ответами:

Предупреждение компилятора "integer overflow in expression" - C++
#include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; int main() { int a, b; double c;

Реализовать классы "Воин", "Пехотинец", "Винтовка", "Матрос", "Кортик" (наследование) - C++
Разработать программу с использованием наследования классов, реализующую классы: − воин; − пехотинец(винтовка); − матрос(кортик). ...

Ошибка "pow : OVERFLOW error" - C++
Вот функция , x записать как константу, b вводить з клавиатуры. А вот код но он не пашет, пашет только первый две функции а дальше ошибка....

Ошибка "pow() overflow error" - C++
Помогите плз составить код на C++ Я начал составлять но столкнулся с проблемой pow overflow error Вот код, который я написал...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
41
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru