Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > функция и массив


Автор: Helicopterr 3.4.2006, 12:42
Есть некоторая ф-ция TextLine которая вызывается каждую секунду.
Есть первый вариант где массив strBuffer объявляется внутри этой ф-ции:
Код

HRESULT TextLine( const WCHAR* strMsg, ... )
{   
    WCHAR strBuffer[512]; 
   //работа по выводу текста  
    va_list args;
    va_start(args, strMsg);
    _vsnwprintf( strBuffer, 512, strMsg, args );
    strBuffer[511] = L'\0';
    va_end(args);
    return TextLineOut ( strBuffer );
}

Есть 2 вариант где массив strBuffer глобальный:
Код

WCHAR strBuffer[512];

HRESULT TextLine( const WCHAR* strMsg, ... )
{   
   //работа по выводу текста  
    va_list args;
    va_start(args, strMsg);
    _vsnwprintf( strBuffer, 512, strMsg, args );
    strBuffer[511] = L'\0';
    va_end(args);
    return TextLineOut ( strBuffer );
}

Будет ли разница в скорости работы этих вариантов?

Автор: Romikgy 3.4.2006, 12:54
Протестируй smile
Имхо будет но очень мала

Автор: Kostt 3.4.2006, 13:52
Однозначно, будет - выделение и освобождение памяти тоже требуют времени. Но так как вызов всего раз в секунду этим можно пренебречь

Автор: Romikgy 3.4.2006, 14:08
Цитата(Kostt @ 3.4.2006, 12:52 Найти цитируемый пост)
Однозначно, будет - выделение и освобождение памяти тоже требуют времени.

Имхо выделение будет производится в стеке , а это одна команда smile т.к. переменая статическая

Автор: 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
Цитата(Helicopterr @ 3.4.2006, 20:49 Найти цитируемый пост)
И еще что если есть третий вариант объявить внутри ф-ции:
static WCHAR strBuffer[512];
с целью избежать выделения памяти при каждом вызове ф-ции?

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

Автор: maxim1000 3.4.2006, 20:35
Цитата(Helicopterr @ 3.4.2006, 17:49 Найти цитируемый пост)
А если предположить что в начале функции объявляется мгного массивов или один но большой

это да, но в этом случае начало массива все равно будет не так далеко от "активно используемой" памяти, а многие стратегии работы кэша любят делать предположения о том, что вся работа ведется "где-то рядом"

есть, правда, один вариант, когда это может ухудшить скорость:
когда какие-то переменные, с которыми идет активная работа, объявлены и перед, и после массива, тогда объявление массива в этом месте приведет к разделению этих переменных и они уже не будут кэшироваться вместе...
так что лучше объявлять его в начале

Цитата(Helicopterr @ 3.4.2006, 17:49 Найти цитируемый пост)
static WCHAR strBuffer[512];

это эквивалентно глобальной переменной...

Автор: regis 4.4.2006, 13:56
Цитата(Fin @ 3.4.2006, 16:09)
Разница будет незначительна. Компилятор по любому делает преобразования со стэком в начале и в конце каждой функции. Единственное что, в VC++ область данных автоматически заполняется байтом 0хCD. Тут другая опасность. Теоретически можно получить глюк, из-за переполнения стэка. Но если не использовать слишком большие массивы, вероятность мала.

ИМХО, разницы по скорости выполнения не будет никакой. (А переполнение массива -- это всегда чревато, независимо от того, находится он в стеке или в DGROUP, где сидят все глобальные данные.)
Но я бы советовал выбрать стековый вариант по простой причине -- память под массив будет reusable. Вообще все данные, которые используются локально, лучше локально и объявлять.


Автор: Helicopterr 5.4.2006, 01:32
Цитата(regis @ 4.4.2006, 13:56)
Вообще все данные, которые используются локально, лучше локально и объявлять.

Хорошо звучит smile

Автор: lusil 7.4.2006, 19:51
Можно задать дурацкий вопрос?! КАК правильно заполнить массив с клавиатуры??

Автор: Kuber 7.4.2006, 20:21
Цитата

Можно задать дурацкий вопрос?! КАК правильно заполнить массив с клавиатуры??

Можно так.
Код

#include <iostream>
using namespace std;

void main()
{
const int ArSz=10;
int MyArray[ArSz]={0};
   for(int i=0;i<ArSz;i++)
     {
             cout << "Введите елемент:"; 
               cin >> MyArray[i];
     }
}


Автор: lusil 8.4.2006, 20:05
ОГРОМНОЕ СПАСИБО smile !!!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)