| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > функция и массив |
| Автор: Helicopterr 3.4.2006, 12:42 | ||||
| Есть некоторая ф-ция TextLine которая вызывается каждую секунду. Есть первый вариант где массив strBuffer объявляется внутри этой ф-ции:
Есть 2 вариант где массив strBuffer глобальный:
Будет ли разница в скорости работы этих вариантов? |
| Автор: Romikgy 3.4.2006, 12:54 |
| Протестируй Имхо будет но очень мала |
| Автор: Kostt 3.4.2006, 13:52 |
| Однозначно, будет - выделение и освобождение памяти тоже требуют времени. Но так как вызов всего раз в секунду этим можно пренебречь |
| Автор: Fin 3.4.2006, 16:09 |
| Разница будет незначительна. Компилятор по любому делает преобразования со стэком в начале и в конце каждой функции. Единственное что, в VC++ область данных автоматически заполняется байтом 0хCD. Тут другая опасность. Теоретически можно получить глюк, из-за переполнения стэка. Но если не использовать слишком большие массивы, вероятность мала. |
| Автор: maxim1000 3.4.2006, 17:15 |
| в принципе, хорошо, когда всё под рукой это относится и к эффективности стек почти наверное, будет в кэше процессора, а значит, использование его вместо области памяти для глобальных переменных потенциально может принести некоторое ускорение хотя могут возникнуть вопросы с таким большим размером массива: кэш-то может быть и большой, но неизвестно (мне неизвестно), какими кусками он выбирает память... ... есть ещё кэш диска (вдруг глобальный массив окажется совсем в другой странице) вот с его точки зрения точно желательно делать переменную локальной... |
| Автор: Helicopterr 3.4.2006, 18:49 |
| А если предположить что в начале функции объявляется мгного массивов или один но большой, ведь размер кэша не бесконечен? Может руководствоваться размером массива? Если он невелик то пусть будет локальным? И еще что если есть третий вариант объявить внутри ф-ции: [code=cpp] static WCHAR strBuffer[512]; [\code] с целью избежать выделения памяти при каждом вызове ф-ции? |
| Автор: Void 3.4.2006, 20:32 | ||
Это полностью эквивалентно варианту с глобальной переменной. На мой взгляд, первый вариант (с переменной в стеке) лучше. Разницу в скорости все равно не заметить и под микроскопом. |
| Автор: maxim1000 3.4.2006, 20:35 | ||
это да, но в этом случае начало массива все равно будет не так далеко от "активно используемой" памяти, а многие стратегии работы кэша любят делать предположения о том, что вся работа ведется "где-то рядом" есть, правда, один вариант, когда это может ухудшить скорость: когда какие-то переменные, с которыми идет активная работа, объявлены и перед, и после массива, тогда объявление массива в этом месте приведет к разделению этих переменных и они уже не будут кэшироваться вместе... так что лучше объявлять его в начале это эквивалентно глобальной переменной... |
| Автор: regis 4.4.2006, 13:56 | ||
ИМХО, разницы по скорости выполнения не будет никакой. (А переполнение массива -- это всегда чревато, независимо от того, находится он в стеке или в DGROUP, где сидят все глобальные данные.) Но я бы советовал выбрать стековый вариант по простой причине -- память под массив будет reusable. Вообще все данные, которые используются локально, лучше локально и объявлять. |
| Автор: Helicopterr 5.4.2006, 01:32 | ||
Хорошо звучит |
| Автор: lusil 7.4.2006, 19:51 |
| Можно задать дурацкий вопрос?! КАК правильно заполнить массив с клавиатуры?? |
| Автор: Kuber 7.4.2006, 20:21 | ||||
Можно так.
|
| Автор: lusil 8.4.2006, 20:05 |
| ОГРОМНОЕ СПАСИБО |