PDA

Просмотр полной версии : [Вопрос] Стек,pragma dynamic



Profyan
05.01.2016, 20:15
Всем привет.Опять о наболевшем.Как-то в одной теме я спрашивал про стек, а именно:

Как происходит подсчет стека?Просто была такая ситуация, что локальные массивы убирал вообще, но стек не менялся. Т.е компилятор высчитывает в каком блоке используется самое большое кол-во байт??
И еще: стек - это на весь мод, или стек - для каждого игрока.Если есть, например, функция и в ней массив(допустим) с 4000 ячейками.И если эта функция вызовется одновременно двумя игроками, то переполнение будет?(4000*4*2 = 32000 байт)

Мне ответили,но не совсем полностью.

Также 2 вопрос: чем вредно использование pragma dynamic.ВЕСЬ Рунэт излазил, и никто не задался вопросом: "Почему ее вредно использовать?"Везде просто отвечали: "Фуу,быдлокодер", "Не используй ее", "Убери прагму".А ответы от ТС были такие : "Хорошо,спасибо", "Окей", "Ладно, а как?" и.т.д.
Кто-то говорил,что стек - это кэш процессора, поэтому ее нельзя делать большой.

Жду ваших ответов:blush:

Daniel_Cortez
05.01.2016, 23:34
Как происходит подсчет стека?Просто была такая ситуация, что локальные массивы убирал вообще, но стек не менялся. Т.е компилятор высчитывает в каком блоке используется самое большое кол-во байт??
Именно.



И еще: стек - это на весь мод, или стек - для каждого игрока.Если есть, например, функция и в ней массив(допустим) с 4000 ячейками.И если эта функция вызовется одновременно двумя игроками, то переполнение будет?(4000*4*2 = 32000 байт)
На этот вопрос вам уже ответили.



Также 2 вопрос: чем вредно использование pragma dynamic.ВЕСЬ Рунэт излазил, и никто не задался вопросом: "Почему ее вредно использовать?"Везде просто отвечали: "Фуу,быдлокодер", "Не используй ее", "Убери прагму".А ответы от ТС были такие : "Хорошо,спасибо", "Окей", "Ладно, а как?" и.т.д.
Кто-то говорил,что стек - это кэш процессора, поэтому ее нельзя делать большой.

Жду ваших ответов:blush:
Если вам нужен размер стека больше 16Кб и вы используете #pragma dynamic, значит вы просто ленивый (сюрприз!) быдлокодер, который не может грамотно использовать стек. По-моему, это должно быть очевидно.
Вместо того, чтобы расширять лимиты, попробуйте уложиться в уже имеющиеся. Избавьтесь от всяких "new string[256]" и рассчитывайте размер массивов, исходя из ситуации, а не под одну кальку. Не используйте несколько переменных (особенно массивов) там, где можно использовать только одну. На этой неделе я постараюсь ещё доделать статью про расчёт размера массивов для форматирования строк.

vovandolg
06.01.2016, 01:43
Избавьтесь от всяких "new string[256]" и рассчитывайте размер массивов, исходя из ситуации, а не под одну кальку. Не используйте несколько переменных (особенно массивов) там, где можно использовать только одну. На этой неделе я постараюсь ещё доделать статью про расчёт размера массивов для форматирования строк.

Получается если есть глобальный string[over9000] и он используется много где, то его надо убрать и сделать в каждом кусочке мода такой только с правильными рассчётами.
Я так понял?

VVWVV
06.01.2016, 01:52
Получается если есть глобальный string[over9000] и он используется много где, то его надо убрать и сделать в каждом кусочке мода такой только с правильными рассчётами.
Я так понял?

Да. Тот массив, который вы создаёте в отдельном блоке — будет уничтожен, а глобальный будет всегда.

Profyan
06.01.2016, 10:19
Именно.



На этот вопрос вам уже ответили.



Если вам нужен размер стека больше 16Кб и вы используете #pragma dynamic, значит вы просто ленивый (сюрприз!) быдлокодер, который не может грамотно использовать стек. По-моему, это должно быть очевидно.
Вместо того, чтобы расширять лимиты, попробуйте уложиться в уже имеющиеся. Избавьтесь от всяких "new string[256]" и рассчитывайте размер массивов, исходя из ситуации, а не под одну кальку. Не используйте несколько переменных (особенно массивов) там, где можно использовать только одну. На этой неделе я постараюсь ещё доделать статью про расчёт размера массивов для форматирования строк.

Значит ее неиспользование обусловлено только морально-этическими нормами программирования.А в плане работоспособности и производительности она никак не повлияет, если я назначу ей любой размер?!
На самом деле я бережно обращаюсь с переменными и массивами, просто задался таким вопросом.

Daniel_Cortez
06.01.2016, 14:21
Значит ее неиспользование обусловлено только морально-этическими нормами программирования.А в плане работоспособности и производительности она никак не повлияет, если я назначу ей любой размер?!
На самом деле я бережно обращаюсь с переменными и массивами, просто задался таким вопросом.
На инициализацию ячеек массива нулями тоже уходит время. Правда, этого можно и избежать (http://pro-pawn.ru/showthread.php?5249&p=62879&viewfull=1#post62879).

Profyan
06.01.2016, 21:04
На инициализацию ячеек массива нулями тоже уходит время. Правда, этого можно и избежать (http://pro-pawn.ru/showthread.php?5249&p=62879&viewfull=1#post62879).

При чем тут массив?Или стек заполняется 0?

Daniel_Cortez
06.01.2016, 21:09
При чем тут массив?Или стек заполняется 0?
Ячейки массива при его создании заполняются нулями. Ну или участок стека - называй, как хочешь. Без этого в ячейках массива будут мусорные значения, оставшиеся после выполнения других функций.

Profyan
07.01.2016, 10:08
Ячейки массива при его создании заполняются нулями. Ну или участок стека - называй, как хочешь. Без этого в ячейках массива будут мусорные значения, оставшиеся после выполнения других функций.

Это реализовано в павн для того,чтобы новички не сталкивались с глупыми ошибками,когда забывали инициализировать переменную.
И если я правильно понял, то от увеличения стека производительность не упадет.Ведь инициализация нулями ничтожно мала,как вы и сказали.
Ну тогда на этом все,можно закрывать тему.

DeimoS
07.01.2016, 10:29
Ведь инициализация нулями ничтожно мала,как вы и сказали.

Это из той же оперы, что "зачем вытирать задницу сейчас, если завтра я опять пойду в туалет?". Из-за подобных "да зачем это делать...?" профессионалы и становятся дилетантами. Если можно свести ущерб к минимуму, лучше это сделать, ибо сегодня Вы забили на инициализацию массивов; завтра забили на подсчёт ячеек в массивах; послезавтра забили ещё на что-то, по-вашему мнению, несущественное и через месяц-другой все Ваши "да и так сойдёт!" превратятся в один большой ком проблем, который поставит крест на всём Вашем коде. И придётся Вам потом искать лазейки, которые Вас выведут, опять таки, к инициализации массивов, ячейкам в массивах и прочему, на что Вы решили забить...
Хотя дело хозяйское... Тема закрыта.