Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> функция и массив 
V
    Опции темы
Helicopterr
Дата 3.4.2006, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 355
Регистрация: 20.8.2005
Где: Stavropol

Репутация: 2
Всего: 3



Есть некоторая ф-ция 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 );
}

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


--------------------
people can fly
PM MAIL   Вверх
Romikgy
Дата 3.4.2006, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 8
Всего: 146



Протестируй smile
Имхо будет но очень мала


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Kostt
Дата 3.4.2006, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 169
Регистрация: 8.1.2006
Где: Томск

Репутация: 1
Всего: 3



Однозначно, будет - выделение и освобождение памяти тоже требуют времени. Но так как вызов всего раз в секунду этим можно пренебречь
PM MAIL   Вверх
Romikgy
Дата 3.4.2006, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 8
Всего: 146



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

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


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Fin
Дата 3.4.2006, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дракон->Спать();
**


Профиль
Группа: Участник
Сообщений: 687
Регистрация: 4.1.2006

Репутация: 3
Всего: 10



Разница будет незначительна. Компилятор по любому делает преобразования со стэком в начале и в конце каждой функции. Единственное что, в VC++ область данных автоматически заполняется байтом 0хCD. Тут другая опасность. Теоретически можно получить глюк, из-за переполнения стэка. Но если не использовать слишком большие массивы, вероятность мала.

Это сообщение отредактировал(а) Fin - 3.4.2006, 16:10


--------------------
Пролетал мимо.
PM MAIL   Вверх
maxim1000
Дата 3.4.2006, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



в принципе, хорошо, когда всё под рукой
это относится и к эффективности
стек почти наверное, будет в кэше процессора, а значит, использование его вместо области памяти для глобальных переменных потенциально может принести некоторое ускорение
хотя могут возникнуть вопросы с таким большим размером массива: кэш-то может быть и большой, но неизвестно (мне неизвестно), какими кусками он выбирает память...
...
есть ещё кэш диска (вдруг глобальный массив окажется совсем в другой странице)
вот с его точки зрения точно желательно делать переменную локальной...


--------------------
qqq
PM WWW   Вверх
Helicopterr
Дата 3.4.2006, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 355
Регистрация: 20.8.2005
Где: Stavropol

Репутация: 2
Всего: 3



А если предположить что в начале функции объявляется мгного массивов или один но большой, ведь размер кэша не бесконечен?
Может руководствоваться размером массива? Если он невелик то пусть будет локальным?
И еще что если есть третий вариант объявить внутри ф-ции:
[code=cpp]
static WCHAR strBuffer[512];
[\code]
с целью избежать выделения памяти при каждом вызове ф-ции?


--------------------
people can fly
PM MAIL   Вверх
Void
Дата 3.4.2006, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 40
Всего: 173



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

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

Это сообщение отредактировал(а) Void - 3.4.2006, 20:33


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
maxim1000
Дата 3.4.2006, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



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

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

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

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

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


--------------------
qqq
PM WWW   Вверх
regis
Дата 4.4.2006, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 232
Регистрация: 12.12.2005
Где: Москва, Россия

Репутация: 2
Всего: 7



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

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


--------------------
В. В чем разница между hardware и software?О. В отличие от второго, по первому можно двинуть кулаком или пнуть ногой.
PM MAIL WWW   Вверх
Helicopterr
Дата 5.4.2006, 01:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 355
Регистрация: 20.8.2005
Где: Stavropol

Репутация: 2
Всего: 3



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

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


--------------------
people can fly
PM MAIL   Вверх
lusil
Дата 7.4.2006, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 27.3.2006

Репутация: нет
Всего: нет



Можно задать дурацкий вопрос?! КАК правильно заполнить массив с клавиатуры??
PM MAIL   Вверх
Kuber
Дата 7.4.2006, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 119
Регистрация: 7.4.2006
Где: #vingrad

Репутация: 1
Всего: 3



Цитата

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

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

#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];
     }
}


--------------------
Если меня угораздило написать что то умное и вам понравилось, то не забудте нажать [-]...:)    
PM ICQ   Вверх
lusil
Дата 8.4.2006, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 27.3.2006

Репутация: нет
Всего: нет



ОГРОМНОЕ СПАСИБО smile !!!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0571 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.