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

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

Вернуться   Форум программистов > Клуб программистов > Свободное общение
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.12.2011, 20:31   #61
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от ITTI Посмотреть сообщение
а я думала, мне только примитивное подойдет. ок, спасибо.
Москва не сразу строилась, Кэп!
Нельзя научится бегать, не научившись стоять на ногах. С++ язык, который постигается постепенно.
_Bers вне форума Ответить с цитированием
Старый 25.12.2011, 01:03   #62
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

Цитата:
Сообщение от Son Of Pain Посмотреть сообщение
Алсо, к вопросу о переменной c - тогда уж лучше внести ее в цикл перед строчкой с cin. "Старайтесь объявлять переменные как можно ближе к месту их использования".
Зачем на каждой итерации цикла заводить переменную, потом ее убивать, чтобы на следующий итерации снова завести?

Цитата:
Сообщение от Son Of Pain Посмотреть сообщение
В реальном коде эту переменную инициализировать никто бы не стал вообще.
Вранье
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
Blade вне форума Ответить с цитированием
Старый 25.12.2011, 09:55   #63
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

Цитата:
Сообщение от Blade Посмотреть сообщение
Зачем на каждой итерации цикла заводить переменную, потом ее убивать, чтобы на следующий итерации снова завести?
Потому что это переменная типа char, и, следовательно, ее "заведение на каждой итерации" не сопряжено с вызовом конструкторов|деструкторов. И если ты откроешь любую хорошую книжку по C++ - ты увидишь там совет "стараться объявлять переменные как можно ближе к месту их использования, если это не сопряжено с другими проблемами".

Цитата:
Вранье
Рекурсивный комментарий.
Son Of Pain вне форума Ответить с цитированием
Старый 25.12.2011, 15:07   #64
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

Цитата:
Сообщение от Son Of Pain Посмотреть сообщение
Потому что это переменная типа char, и, следовательно, ее "заведение на каждой итерации" не сопряжено с вызовом конструкторов|деструкторов. И если ты откроешь любую хорошую книжку по C++ - ты увидишь там совет "стараться объявлять переменные как можно ближе к месту их использования, если это не сопряжено с другими проблемами".
Как можно ближе - не значит 2 миллиона раз в цикле ее объявлять.

Цитата:
Сообщение от Son Of Pain Посмотреть сообщение
Рекурсивный комментарий.
Видимо, твой "реальный код" отличаются от общепринятого
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
Blade вне форума Ответить с цитированием
Старый 25.12.2011, 15:10   #65
Сtrl
C++
Форумчанин
 
Аватар для Сtrl
 
Регистрация: 27.03.2011
Сообщений: 803
По умолчанию

Цитата:
Как можно ближе - не значит 2 миллиона раз в цикле ее объявлять.
Выносить объявление из цикла - это преждевременная оптимизация. Не делайте за компилятор его работу.
Ищете информацию по C++?
cplusplus.com
Сtrl вне форума Ответить с цитированием
Старый 25.12.2011, 15:11   #66
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

Цитата:
Сообщение от Сtrl Посмотреть сообщение
Выносить объявление из цикла - это преждевременная оптимизация. Не делайте за компилятор его работу.
Ее не надо оттуда выносить, ее надо туда не вносить, и ни о какой оптимизации речи не идет.
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
Blade вне форума Ответить с цитированием
Старый 25.12.2011, 15:47   #67
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от Blade Посмотреть сообщение
Ее не надо оттуда выносить, ее надо туда не вносить, и ни о какой оптимизации речи не идет.
Вы же не думаете, что в цикле каждый раз будет дёргаться sp для выделения/освобождения памяти под переменную? Память выделяется один раз в начале подпрограммы. А потом над ней только вызываются конструкторы и деструкторы, но так как char тривиален, то конструктора для него вызвано не будет, а так как нигде, кроме как в цикле, эта переменная не нужна, то её необходимо положить в область видимости этого цикла.
netrino вне форума Ответить с цитированием
Старый 25.12.2011, 16:10   #68
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от netrino Посмотреть сообщение
Вы же не думаете, что в цикле каждый раз будет дёргаться sp для выделения/освобождения памяти под переменную?
Если компилятор её сам за тело цикла не выставит - да. Будит дергаться.

Цитата:
Сообщение от netrino Посмотреть сообщение
Память выделяется один раз в начале подпрограммы.
Один раз при запуске процесса?
А все остальное время она "дергается", Не?

Цитата:
Сообщение от netrino Посмотреть сообщение
А потом над ней только вызываются конструкторы и деструкторы, но так как char тривиален, то конструктора для него вызвано не будет, а так как нигде, кроме как в цикле, эта переменная не нужна, то её необходимо положить в область видимости этого цикла.
"Положить в область видимости" И миллион раз создавать и убивать - это немножко разные вещи.
_Bers вне форума Ответить с цитированием
Старый 25.12.2011, 16:13   #69
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

Цитата:
Сообщение от Blade Посмотреть сообщение
Как можно ближе - не значит 2 миллиона раз в цикле ее объявлять.
Прежде чем вбрасывать сюда пафосные лозунги, тебе стоило бы ознакомиться с базовыми принципами кодогенерации в C++. Очевидно, что компилятор не будет выделять память в стеке (если ты знаешь, что это такое) на каждой итерации цикла. Он либо сразу выделит область для всех локальных переменных при входе в функцию, либо сделает
Код:
sub esp, X
перед входом в цикл, либо просто использует место, оставшееся от другой локальной переменной, чье время жизни к тому моменту закончилось. Следовательно, обращение к переменной будет идти через [esp+константа]; и код после компиляции с переменной, внесенной в стек, будет отличаться от кода с вынескенной переменной только значением константы, прибавляемой к esp.

Следовательно, в данном случае вопрос рассматривать стоит только с точки зрения читаемости исходного кода. И тут я повторю свой совет из предыдущего комментария - открыть любую книжку по C++ и прочитать, что там написано по этому поводу. Если без этого не очевидно, что объявление переменных рядом с местом использования выглядит логичнее, чем их нагромождение в начале блока кода.

Такие дела.
Son Of Pain вне форума Ответить с цитированием
Старый 25.12.2011, 16:17   #70
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Один раз при запуске процесса?
подпрограммы
Цитата:
Если компилятор её сам за тело цикла не выставит - да. Будит дергаться.
компиляторы имеют довольно хороший оптимизатор.
если хотите можно проверить на gcc(MinGW) и студии.

да и команда sub esp,1 ;//(если без выравнивания)
довольна быстра. потому даже без оптимизации скорость не упадет в общем то.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
PopupMenu со мной не дружит Жигилий_Ульяна Компоненты Delphi 5 25.12.2008 11:04
проблемы с select или со мной... smoke888 JavaScript, Ajax 2 23.09.2008 19:02