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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> функция с переменным числом параметров 
:(
    Опции темы
mes
Дата 6.6.2011, 09:20 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



ИванМ, примерчик для размышеления: 
Код



int main ()
{
   typedef std::function<void()> fn_t;
   std::vector<fn_t> v;

// цикл, как имитация работы интерпретатора :   
   for (int i=0; i<10;++i)
   {
      static const char * strs[] = { "hallo", "world", "!"};
      double d = i*1.3;

      if (i == 0)    v.push_back([=](){ std::cout << "ints: "; } ); 
      if (i/3 == 0)  v.push_back([=](){ std::cout << i<< " "; } );
      if (i == 3)    v.push_back([=](){ std::cout << std::endl << "doubles: "; } );       
      if (i/3 == 1)  v.push_back([=](){ std::cout << d<< " "; } );
      if (i == 6)    v.push_back([=](){ std::cout << std::endl << "strings: "; } );           
      if (i/3 == 2)  v.push_back([=](){ std::cout << strs[i%3]<< " "; } );
      if (i == 9)    v.push_back([=](){ std::cout << std::endl; } );           
      
   }
   
// выполнение полученного сценария :
   for(fn_t fn : v) fn();
     
}

http://liveworkspace.org/code/8edb2836fcf7...cc0b5a3c976e008



--------------------
PM MAIL WWW   Вверх
ИванМ
Дата 6.6.2011, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

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



mes, пример интересный, но как он вяжется с моей задачей?
PM MAIL   Вверх
bsa
Дата 6.6.2011, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



ИванМ, значительного (более нескольких процентов) выигрыша в производительности ты не получишь по сравнению с использованием функции вида:
Код
struct TypeValuePair {
   Type type;
   void *ptr;
};

void print(const std::vector<TypeValuePair> &tvp);
Лучше ищи, другие места затыков в программе.
PM   Вверх
ИванМ
Дата 6.6.2011, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

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



Цитата

Нет, на си не получится. На Си ( __cdecl) вызываемая функция не восстанавливает стек, это возложено на вызывающую.
Так что обе на асме.  smile 

Так я и собираюсь вызывающую писать на ассемблере. Ассемблер и очистит стек.

Цитата

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

Как это понять?

Цитата(azesmcar @  6.6.2011,  08:52 Найти цитируемый пост)
раз уж тебя так волнует скорость копирования элементов, значит этих элементов немало, как ты предполагаешь запихнуть это все в стек? 

Не очень много, не больше десяти.

Цитата

во вторых производетельность Вы в любом случае вряд ли увеличите изменив способ вызова, так как сопуствующие расходы, о которых Вы упомянули в теме, гораздо выше.. 

Какие имеются ввиду сопутстствующие расходы?

Добавлено через 1 минуту и 36 секунд
Видимо действительно дело не в передаче параметров. Надо смотреть весь алгоритм.
PM MAIL   Вверх
bsa
Дата 6.6.2011, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(ИванМ @  6.6.2011,  10:24 Найти цитируемый пост)
Какие имеются ввиду сопутстствующие расходы?

надо все затолкать в стек. По сути, разницы между заталкиванием в стек и в контейнер разницы практически нет. Причем, стек имеет более серьезные ограничения на размер, чем контейнер в куче.
PM   Вверх
mes
Дата 6.6.2011, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(ИванМ @  6.6.2011,  09:13 Найти цитируемый пост)
но как он вяжется с моей задачей? 

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

Добавлено через 5 минут и 10 секунд
Цитата(ИванМ @  6.6.2011,  09:24 Найти цитируемый пост)
Как это понять?

от наличия бензина велосипед не полетит + летать на велосипедах это особый экстрим, которого в программированнии лучше избегать smile
 smile

Добавлено через 6 минут и 35 секунд
Цитата(ИванМ @  6.6.2011,  09:24 Найти цитируемый пост)
Видимо действительно дело не в передаче параметров. Надо смотреть весь алгоритм. 
 smile 



--------------------
PM MAIL WWW   Вверх
ИванМ
Дата 6.6.2011, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

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



Думаю, что скорее всего теряется производительность из-за постоянного выделения памяти.
Вот, пример моей программы:
Код

    void USER_PREDICATE::SetParams(const vector< ptr<DATA> > & params_)
    {
        out_params.resize(params_.size());    
        params.resize(params_.size());    
        std::copy(params_.begin(), params_.end(), out_params.begin());
        for(size_t i=0;i<params.size();i++)
        {
            if(dynamic_cast<REFERENCE*>(params_[i].get()))
                params[i]=params_[i];    
            else if(dynamic_cast<VARIABLE*>(params_[i].get()))
                params[i]=ptr<DATA>(new VARIABLE(*((VARIABLE*)params_[i].get())));                    
            else
                params[i]=params_[i];
        }
    }

    bool USER_PREDICATE::Run()
    { 
        vector<ptr<DATA>> start_pars(params.size());

        for(size_t i=0;i<params.size();i++)
        {
            if(dynamic_cast<REFERENCE*>(params[i].get()))
                start_pars[i]=params[i];    
            else if(dynamic_cast<VARIABLE*>(params[i].get()))
                start_pars[i]=ptr<DATA>(new VARIABLE(*((VARIABLE*)params[i].get())));
            else
                start_pars[i]=params[i];
        }

        while(next_line<pred_code->Size())
        {
            ptr<LINE> line;
            if(!last_line)
                line=ptr<LINE>(new LINE((*pred_code.get())[next_line]));
            else
                line=last_line;
            if(!last_line)
            {
                size_t size=(*pred_code.get())[next_line]->GetNeedVars();
                if(params.size()>size) size=params.size();
                for(size_t i=0;i<size;i++)
                {
                    if(i<params.size())
                    {
                        if(dynamic_cast<VARIABLE*>(params[i].get()))
                        {
                            line->AddVar(params[i]);
                        }
                        else
                        {
                            ptr<VARIABLE> var(new VARIABLE);
                            *var.get()=*params[i].get();
                            line->AddVar(var);
                        }
                    }
                    else
                        line->AddVar(ptr<VARIABLE>(new VARIABLE));                

                }
            }
            bool isSucc;
            try
            {
                isSucc=!last_line && line->Run() || last_line && line->Back();
            }
            catch(const vector< ptr<DATA> >& params)
            {
                SetParams(params);
                last_line=ptr<LINE>();
                next_line=0;
                continue;
            }
            if(isSucc)
            {
                if(line->IsNotEnd())
                    last_line=line;
                else
                {
                    last_line=ptr<LINE>();
                    next_line++;
                }
                for(size_t i=0;i<params.size();i++)
                {
                    if(dynamic_cast<VARIABLE*>(params[i].get()))
                    {
                        *((VARIABLE*)out_params[i].get())=*((VARIABLE*)params[i].get());
                        *((VARIABLE*)params[i].get())=*((VARIABLE*)start_pars[i].get());
                    }
                }
                return true;
            }            
            else
            {
                next_line++;
                for(size_t i=0;i<params.size();i++)
                {
                    if(dynamic_cast<VARIABLE*>(params[i].get()))
                    {
                        *((VARIABLE*)params[i].get())=*((VARIABLE*)start_pars[i].get());
                    }
                }
            }
        }
        return false;
    }

PM MAIL   Вверх
boostcoder
Дата 6.6.2011, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

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



жестокий код.
огромное кол-во dinamic_cast`ов настораживает.
лучше бы Вы озвучили задачу, и задавали вопросы постепенно..
PM WWW   Вверх
pilotnet
Дата 16.6.2011, 07:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вот здесь почитай
rsnd 
PM MAIL   Вверх
boostcoder
Дата 16.6.2011, 07:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

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



Цитата(pilotnet @  16.6.2011,  07:40 Найти цитируемый пост)
rsnd

новое название? smile

PM WWW   Вверх
borisbn
Дата 16.6.2011, 08:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



Цитата(boostcoder @ 16.6.2011,  07:45)
Цитата(pilotnet @  16.6.2011,  07:40 Найти цитируемый пост)
rsnd

новое название? smile

RoStovNaDonu smile



<----------------

Это сообщение отредактировал(а) borisbn - 16.6.2011, 08:10


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
boostcoder
Дата 16.6.2011, 08:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

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



)      
PM WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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