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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ускорить код 
V
    Опции темы
Любитель
Дата 18.6.2008, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

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



Цитата(SABROG @  18.6.2008,  14:41 Найти цитируемый пост)
остался вопрос об автозаполнении массива на этапе компиляции, чтобы не приходилось ручками вбивать 0, 1, 2 и т.д. 

Внешний кодогенератор. Средства метапрограммирования в С++ достаточно скудные и прилепленны искусственно (если речь про шаблоны) или в устаревшо-неудобно-нефункциональном виде (препроцессор).

Цитата(Lazin @  18.6.2008,  13:59 Найти цитируемый пост)
Mayk, а как это, или что-то подобное, можно прикрутить к своей системе сборки?

Дык это зависит от твоей билд-системы smile


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


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


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

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



вот с использованием кода от Sabrog, автозаполнение таблицы значениями расчитамными в компил-тайм

Код

#include <cstdlib>
#include <iostream>

template <class T, int n>
struct Initer {
       Initer (T* obj) : m_init(obj) { obj->template init<n>();  };
   private:
       Initer <T, n-1> m_init;
};

template <class T> struct Initer<T,-1> {  Initer (T* obj)  {};       };


    template<unsigned n>
    struct NBits
    {
      enum { value =  n & 1 ?  NBits<(n >> 1)>::value + 1 : NBits<(n >> 1)>::value};
    };

    template<>
    struct NBits<0>
    {
      enum { value = 0 };
    };


template <int length>
class MyTable
{
    public:
        MyTable () :m_init(this) {}

        int operator [] (int i) const  { return m_data[i]; }
        size_t size ()          const  { return length; }


        template<int n> void init ()  { m_data[n] = NBits<n>::value; }

    private:
         int m_data[length];
         Initer<MyTable, length-1> m_init;
};

int main()
{


  MyTable<256> table;
  for (size_t i=0; i<table.size(); ++i  ) { std::cout << table[i] <<" ";}

    system("pause");
}




--------------------
PM MAIL WWW   Вверх
SABROG
Дата 18.6.2008, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

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



Не, ну рассчитать в компайл-тайм не вопрос, и уж совсем не вопрос заполнить в ран-тайме. А вот как бы сгенерить 255 байт в секции данных с уже инициализированными значениями и получить ссылку на первый байт. Так чтобы остановившись в entry-point и глядя на секцию данных мы бы уже видели этот заполненный массив, чтобы на это ни тратилось ни одного лишнего такта процессора.

Появилась мысль использовать union с массивом и тупым набором переменных. Интересно реально ли.

Это сообщение отредактировал(а) SABROG - 18.6.2008, 17:56


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
mes
Дата 18.6.2008, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(SABROG @  18.6.2008,  17:55 Найти цитируемый пост)
Не, ну рассчитать в компайл-тайм не вопрос, и уж совсем не вопрос заполнить в ран-тайме.  А вот как бы сгенерить 255 байт в секции данных с уже инициализированными значениями и получить ссылку на первый байт. 


Цитата(SABROG @  18.6.2008,  13:12 Найти цитируемый пост)

const unsigned char zbits[256] = {
        8-NBits<0>::value, 8-NBits<1>::value, 8-NBits<2>::value, 8-NBits<3>::value, 
        8-NBits<4>::value, 8-NBits<5>::value, 8-NBits<6>::value, 8-NBits<7>::value, 
....


тут кстати тоже идет заполнение масива zbits в рантайме , а не используется указатель на данные размешенные в секции данных  smile 



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


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


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

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



вот так они будут располагаться в сегменте данных
Код

#define C_(a) #a
const unsigned char *zbits =
        C_(8)C_(7)C_(7)C_(6)C_(7)C_(6)C_(6)C_(5)C_(7)C_(6)C_(6)C_(5)C_(6)C_(5)
        C_(5)C_(4)C_(7)C_(6)C_(6)C_(5)C_(6)C_(5)C_(5)C_(4)C_(6)C_(5)C_(5)C_(4)C_(5)C_(4)C_(4)C_(3)C_(7)C_(6)C_(6)C_(5)C_(6)C_(5)C_(5)C_(4)C_(6)
        C_(5)C_(5)C_(4)C_(5)C_(4)C_(4)C_(3)C_(6)C_(5)C_(5)C_(4)C_(5)C_(4)C_(4)C_(3)C_(5)C_(4)C_(4)C_(3)C_(4)C_(3)C_(3)C_(2)C_(7)C_(6)C_(6)C_(5)
        C_(6)C_(5)C_(5)C_(4)C_(6)C_(5)C_(5)C_(4)C_(5)C_(4)C_(4)C_(3)C_(6)C_(5)C_(5)C_(4)C_(5)C_(4)C_(4)C_(3)C_(5)C_(4)C_(4)C_(3)C_(4)C_(3)C_(3)
        C_(2)C_(6)C_(5)C_(5)C_(4)C_(5)C_(4)C_(4)C_(3)C_(5)C_(4)C_(4)C_(3)C_(4)C_(3)C_(3)C_(2)C_(5)C_(4)C_(4)C_(3)C_(4)C_(3)C_(3)C_(2)C_(4)C_(3)
        C_(3)C_(2)C_(3)C_(2)C_(2)C_(1)C_(7)C_(6)C_(6)C_(5)C_(6)C_(5)C_(5)C_(4)C_(6)C_(5)C_(5)C_(4)C_(5)C_(4)C_(4)C_(3)C_(6)C_(5)C_(5)C_(4)C_(5)
        C_(4)C_(4)C_(3)C_(5)C_(4)C_(4)C_(3)C_(4)C_(3)C_(3)C_(2)C_(6)C_(5)C_(5)C_(4)C_(5)C_(4)C_(4)C_(3)C_(5)C_(4)C_(4)C_(3)C_(4)C_(3)C_(3)C_(2)
        C_(5)C_(4)C_(4)C_(3)C_(4)C_(3)C_(3)C_(2)C_(4)C_(3)C_(3)C_(2)C_(3)C_(2)C_(2)C_(1)C_(6)C_(5)C_(5)C_(4)C_(5)C_(4)C_(4)C_(3)C_(5)C_(4)C_(4)
        C_(3)C_(4)C_(3)C_(3)C_(2)C_(5)C_(4)C_(4)C_(3)C_(4)C_(3)C_(3)C_(2)C_(4)C_(3)C_(3)C_(2)C_(3)C_(2)C_(2)C_(1)C_(5)C_(4)C_(4)C_(3)C_(4)C_(3)
        C_(3)C_(2)C_(4)C_(3)C_(3)C_(2)C_(3)C_(2)C_(2)C_(1)C_(4)C_(3)C_(3)C_(2)C_(3)C_(2)C_(2)C_(1)C_(3)C_(2)C_(2)C_(1)C_(2)C_(1)C_(1)C_(0);


на такую конструкцию заполнить можно либо кодогенератором, либо вручную



--------------------
PM MAIL WWW   Вверх
Lazin
Дата 18.6.2008, 20:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



mes, ты вручную это написал?
Цитата(mes @  18.6.2008,  18:35 Найти цитируемый пост)
тут кстати тоже идет заполнение масива zbits в рантайме , а не используется указатель на данные размешенные в секции данных 

нет, тут все четко во время компиляции...
PM MAIL Skype GTalk   Вверх
SABROG
Дата 18.6.2008, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

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



Цитата(mes @  18.6.2008,  18:35 Найти цитируемый пост)
тут кстати тоже идет заполнение масива zbits в рантайме , а не используется указатель на данные размешенные в секции данных


Как сказал Lazin, все четко - во время компиляции. Я это специально проверял в отладчике прежде чем постить на форум. Может быть стоит убрать const, т.к. я без него проверял. Вспоминаю возможности макросов в fasme, ну или хотябы в masme и плакать хочется над системой макросов в C++. Зато страшно интересно.

2mes, тоже думал над этим. Хочу как-то заюзать конкатенацию строк, чтобы можно было при каждом вхождении в шаблон добавлять к строке что-то типа ", 8-NBits<n>::value", а потом итоговый дефайн вставить в массив. Но ничего не выходит.

Это сообщение отредактировал(а) SABROG - 18.6.2008, 21:17


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
mes
Дата 18.6.2008, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Lazin @  18.6.2008,  20:50 Найти цитируемый пост)
mes, ты вручную это написал?

неа,  увольте .. я ленив для столь однообразного набора   smile 

Цитата(SABROG @  18.6.2008,  21:14 Найти цитируемый пост)
Как сказал Lazin, все четко - во время компиляции. Я это специально проверял в отладчике прежде чем постить на форум. 

спасиб, буду знать..   smile 

Цитата(SABROG @  18.6.2008,  21:14 Найти цитируемый пост)
2mes, тоже думал над этим. Хочу как-то заюзать конкатенацию строк, чтобы можно было при каждом вхождении в шаблон добавлять к строке что-то типа ", 8-NBits<n>::value", а потом итоговый дефайн вставить в массив. Но ничего не выходит.

я тоже пытался  smile  но чудо не получилось  smile 
 smile 


Это сообщение отредактировал(а) mes - 18.6.2008, 21:57


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


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



до меня то-же не доперло как это сделать шаблонами... smile 
PM MAIL Skype GTalk   Вверх
mes
Дата 18.6.2008, 23:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



вот сделал набросок кодогенератора на основе препроцессора
и пример с его использованием по авто заполнению массива 

Код

#include <cstdlib>
#include <iostream>
#include "KG.h"

    template<unsigned n>
    struct NBits
    {
      enum { value =  n & 1 ?  NBits<(n >> 1)>::value + 1 : NBits<(n >> 1)>::value};
    };

    template<>
    struct NBits<0>
    {
      enum { value = 0 };
    };

int mas[] = { KG_progression100 ( NBits<,  0,+1,>::value)
             ,KG_progression100 ( NBits<,100,+1,>::value)
             ,KG_progression50  ( NBits<,200,+1,>::value)
             ,KG_progression6   ( NBits<,250,+1,>::value) };

int main()
{

 for (size_t i=0; i<256; ++i ) { std::cout << mas[i] << ' ' ; }

    system("pause");
}



// kg.h :
Код


#define KG_repeat0(a)   /*a*/
#define KG_repeat1(a)   a
#define KG_repeat2(a)   a a
#define KG_repeat3(a)   a a a
#define KG_repeat4(a)   a a a a
#define KG_repeat5(a)   a a a a a
#define KG_repeat6(a)   KG_repeat5(a) a
#define KG_repeat7(a)   KG_repeat5(a) a a
#define KG_repeat8(a)   KG_repeat5(a) a a a
#define KG_repeat9(a)   KG_repeat5(a) a a a a
#define KG_repeat10(a)  KG_repeat5(a) KG_repeat5(a)

#define KG_progression1(fbeg,val,suf,fend)   fbeg val KG_repeat0(suf) fend
#define KG_progression2(fbeg,val,suf,fend)   KG_progression1(fbeg,val,suf,fend), fbeg val KG_repeat1(suf) fend
#define KG_progression3(fbeg,val,suf,fend)   KG_progression2(fbeg,val,suf,fend), fbeg val KG_repeat2(suf) fend
#define KG_progression4(fbeg,val,suf,fend)   KG_progression3(fbeg,val,suf,fend), fbeg val KG_repeat3(suf) fend
#define KG_progression5(fbeg,val,suf,fend)   KG_progression4(fbeg,val,suf,fend), fbeg val KG_repeat4(suf) fend
#define KG_progression6(fbeg,val,suf,fend)   KG_progression5(fbeg,val,suf,fend), fbeg val KG_repeat5(suf) fend
#define KG_progression7(fbeg,val,suf,fend)   KG_progression6(fbeg,val,suf,fend), fbeg val KG_repeat6(suf) fend
#define KG_progression8(fbeg,val,suf,fend)   KG_progression7(fbeg,val,suf,fend), fbeg val KG_repeat7(suf) fend
#define KG_progression9(fbeg,val,suf,fend)   KG_progression8(fbeg,val,suf,fend), fbeg val KG_repeat8(suf) fend
#define KG_progression10(fbeg,val,suf,fend)  KG_progression9(fbeg,val,suf,fend), fbeg val KG_repeat9(suf) fend
#define KG_progression20(fbeg,val,suf,fend)  KG_progression10(fbeg,val,suf,fend), KG_progression10(fbeg,val KG_repeat10(suf),suf,fend)
#define KG_progression30(fbeg,val,suf,fend)  KG_progression20(fbeg,val,suf,fend), KG_progression10(fbeg,val KG_repeat2(KG_repeat10(suf)),suf,fend)
#define KG_progression40(fbeg,val,suf,fend)  KG_progression30(fbeg,val,suf,fend), KG_progression10(fbeg,val KG_repeat3(KG_repeat10(suf)),suf,fend)
#define KG_progression50(fbeg,val,suf,fend)  KG_progression40(fbeg,val,suf,fend), KG_progression10(fbeg,val KG_repeat4(KG_repeat10(suf)),suf,fend)
#define KG_progression60(fbeg,val,suf,fend)  KG_progression50(fbeg,val,suf,fend), KG_progression10(fbeg,val KG_repeat5(KG_repeat10(suf)),suf,fend)
#define KG_progression70(fbeg,val,suf,fend)  KG_progression60(fbeg,val,suf,fend), KG_progression10(fbeg,val KG_repeat6(KG_repeat10(suf)),suf,fend)
#define KG_progression80(fbeg,val,suf,fend)  KG_progression70(fbeg,val,suf,fend), KG_progression10(fbeg,val KG_repeat7(KG_repeat10(suf)),suf,fend)
#define KG_progression90(fbeg,val,suf,fend)  KG_progression80(fbeg,val,suf,fend), KG_progression10(fbeg,val KG_repeat8(KG_repeat10(suf)),suf,fend)
#define KG_progression100(fbeg,val,suf,fend) KG_progression90(fbeg,val,suf,fend), KG_progression10(fbeg,val KG_repeat9(KG_repeat10(suf)),suf,fend)



P.S. подправлено чтоб в основном коде не использовальзовать #define

Это сообщение отредактировал(а) mes - 19.6.2008, 09:18


--------------------
PM MAIL WWW   Вверх
Mayk
Дата 19.6.2008, 05:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


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

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



Цитата(Lazin @  19.6.2008,  02:11 Найти цитируемый пост)
до меня то-же не доперло как это сделать шаблонами... smile  

А до меня не совсем доперло --- зачем? Шаблоны в си++ для вычислений унылы чуть менее чем полностью. 
А если мы вспомним boosts.preprocessor, то станет совсем грустно. В D емнип compile-time вычисления были неплохо сделаны.


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Alek86
Дата 19.6.2008, 10:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



офф

Mayk, предлагаешь всем пересесть на Д?
(кажись, среди нас появились диверсанты  smile  )

Это сообщение отредактировал(а) Alek86 - 19.6.2008, 10:12


--------------------
user posted image    user posted image
PM MAIL   Вверх
Любитель
Дата 19.6.2008, 12:14 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

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



Я предлагаю использовать средства по прямому значению. Препроцессор в С++ слабый и от него больше проблем, чем помощи (обычно). Шаблоны - да, это средство метапрограммирования, но их основная цель - абстракция от типа. Вот ту кучу примеров с шаблонами, которые были написаны - разве их удобно читать? smile Внешние кодогенераторы юзались и будут юзаться. И это нормально для любого языка. Даже если язык имеет встроенные серьёзные возможности метапрограммирования - если проще использовать внешний кодогенератор, почему бы и нет?


--------------------
PM MAIL ICQ Skype   Вверх
Страницы: (3) Все 1 2 [3] 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0908 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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