Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.04.2014, 15:14   #11
FataLL
Форумчанин
 
Аватар для FataLL
 
Регистрация: 29.01.2013
Сообщений: 319
По умолчанию

А чему равен /STACK:xxx у компоновщика?

Думаю, что какой бы не был умный компилятор, он не в состоянии задать "правильный" размер стека. Особенно тогда, когда приложение специально написано для вызова исключения. К тому же, если воспользоваться обработкой исключительных ситуаций, можно продлить агонию некоторое время...
FataLL вне форума Ответить с цитированием
Старый 27.04.2014, 15:38   #12
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Цитата:
Сообщение от Arigato Посмотреть сообщение
Правда? Интересно, почему:
Либо настройте компилятор, либо меняйте на что ни будь посовременней.
В современных ОС таких ограничений нет!
У меня ваша код накрутил где-то 87000 итераций, что при 12 байтах памяти в стеке дает как раз около одного мегабайта, что является размером стека по умолчанию. Стек (в теории) можно довести до около 2Г (если очень стараться - до 3Г) что есть предел для 32бит винды.
waleri вне форума Ответить с цитированием
Старый 27.04.2014, 15:49   #13
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Мой GCC накрутил 64903 вызова, так что подтверждаю. Прога заняла в стеке 250 Кб и свалилась.
Цитата:
при 12 байтах памяти
Не понял, почему 12?
I'm learning to live...

Последний раз редактировалось Stilet; 27.04.2014 в 15:54.
Stilet вне форума Ответить с цитированием
Старый 27.04.2014, 16:34   #14
FataLL
Форумчанин
 
Аватар для FataLL
 
Регистрация: 29.01.2013
Сообщений: 319
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Не понял, почему 12?
Наверное, так: push i, call rec 8 байт на вызов, плюс фрейм в самой rec начинается с push bp. Вот и 12...
FataLL вне форума Ответить с цитированием
Старый 27.04.2014, 16:38   #15
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,551
По умолчанию

Проверил в VS2012 на Win7, настройки компилятора по умолчанию, получил 4718, на 1 итерацию больше!!! Но это в конфигурации Debug. Запустил в Release, идет бесконечно (с переполнением int и т.д.), видимо, компилятор развернул рекурсию в цикл.
Arigato вне форума Ответить с цитированием
Старый 27.04.2014, 16:46   #16
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

В комплекте студии есть такая утилитка - dumpbin.exe
С ее помощью можно посмотреть сколько именно стека задано программе реально.
dumpbin -headers file.exe
waleri вне форума Ответить с цитированием
Старый 27.04.2014, 21:33   #17
Airhand
Пользователь
 
Аватар для Airhand
 
Регистрация: 23.08.2011
Сообщений: 55
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
DOS давно умер, в современных ОС таких ограничений нет.
Заходим в Borland c++ builder 6 (он выпущен в 2002 году, когда дос давно умер). В опциях проекта идём на вкладку линкер и смотрим на max stack size (0x00002000), что в десятичной равно 8192 байта, т.к. переменные передаются через стек, понимаем, что waleri сморозил полную ахинею.

Цитата:
Сообщение от Arigato Посмотреть сообщение
Запустил в Release, идет бесконечно (с переполнением int и т.д.), видимо, компилятор развернул рекурсию в цикл.
Если идёт переполнение инта, то ужО не нормально, просто в релиз не стоит галка "range check error", поэтому не валится.
"Пока бабка не смоет косметику, русский мужик не перекрестится" (C) Кто-то

Последний раз редактировалось Stilet; 27.04.2014 в 23:17.
Airhand вне форума Ответить с цитированием
Старый 27.04.2014, 23:36   #18
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,551
По умолчанию

Цитата:
Сообщение от Airhand Посмотреть сообщение
Если идёт переполнение инта, то ужО не нормально
Что тут ненормального? Это говорит лишь о том, что число шагов более 2 миллиардов.

Проверил на таком примере:
Код:
#include <iostream>

void rec(int i){
	if(i % 1000 == 0)std::cout<<"DOWN:"<<i<<"\n";
	if(i<1000000000) rec(i+1);
	std::cout<<"UP: "<<i<<"\n";
}

void main()
{
	rec(1);
	system("pause");
}
В конфигурации Release дошло до 42000 и отвалилось. Но если убрать действие на рекурсивном возврате std::cout<<"UP: "<<i<<"\n"; то идет до миллиарда. То есть компилятор такой вариант рекурсии сам разворачивает.
Arigato вне форума Ответить с цитированием
Старый 28.04.2014, 10:09   #19
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Цитата:
Сообщение от Airhand Посмотреть сообщение
Заходим в Borland c++ builder 6 (он выпущен в 2002 году, когда дос давно умер). В опциях проекта идём на вкладку линкер и смотрим на max stack size (0x00002000), что в десятичной равно 8192 байта, т.к. переменные передаются через стек, понимаем, что waleri сморозил полную ахинею.
Я сказал, что современные ОС не накладывают таких ограничений (в отличии от ДОС, где сегмент не мог превышать 64К). А то, что какой-то компилятор десятилетний давности накладывает какие либо ограничения это всецело проблемы данного компилятора и тех, кто им пользуется.

Так что либо, будьте любезны, предоставить список современных ОС, которые накладывают такие ограничения (64К) либо ахинею несете вы.
waleri вне форума Ответить с цитированием
Старый 28.04.2014, 12:07   #20
Airhand
Пользователь
 
Аватар для Airhand
 
Регистрация: 23.08.2011
Сообщений: 55
По умолчанию

Цитата:
Сообщение от Arigato Посмотреть сообщение
Что тут ненормального? Это говорит лишь о том, что число шагов более 2 миллиардов.
То хотябы, что путаете ограничение цыкла и int параметра функции: происходит банальное его переполнение.

Цитата:
Сообщение от waleri Посмотреть сообщение
Я сказал, что современные ОС не накладывают таких ограничений (в отличии от ДОС, где сегмент не мог превышать 64К). А то, что какой-то компилятор десятилетний давности накладывает какие либо ограничения это всецело проблемы данного компилятора и тех, кто им пользуется.

Так что либо, будьте любезны, предоставить список современных ОС, которые накладывают такие ограничения (64К) либо ахинею несете вы.
У MS тоже фиговый компилятор: мнУ ужО не помнит где (просто они не стоят, и у мнУ их нет ужО), но VC++ 2003 и 2005 это ограничение тоже было. Проблемма у тех, кто не знает о подобных ограничениях и пишет соотвественно, потом такие ошибки очень трудно находить. Это не от компилятора зависит: упаковка PE выполнямого файла такое требует. Просто Borland даёт регулировать эти аспекты, а большинство совремменых компиляторов - нет.
"Пока бабка не смоет косметику, русский мужик не перекрестится" (C) Кто-то
Airhand вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Дана строка, арифметические выражения вида A x B. Вычислить значение выражения Un1q Паскаль, Turbo Pascal, PascalABC.NET 4 09.12.2013 14:47
вычислить значение выражения (на C++) laychan Помощь студентам 2 05.03.2012 11:32
вычислить значение выражения ulechka128 Помощь студентам 0 25.12.2011 13:35
вычислить значение выражения _Иван_ Помощь студентам 2 20.04.2011 18:58