Форум программистов, компьютерный форум, киберфорум
Наши страницы

Boost C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 5.00
NeonLost
Пес войны
75 / 86 / 3
Регистрация: 23.02.2012
Сообщений: 653
#1

tmp with mpl - Boost C++

12.02.2013, 19:30. Просмотров 1323. Ответов 3
Метки нет (Все метки)

я в ран тайме заполняю массив числами фибоначи до 10000 элемента...можно ли вычислить в компиле тайм и в рантайме только заполнить?..)
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.02.2013, 19:30
Здравствуйте! Я подобрал для вас темы с ответами на вопрос tmp with mpl (Boost C++):

MPL push_back - Boost C++
А как тут push_back пользоваться?#include <iostream> #include <type_traits> #include <boost/mpl/vector.hpp> #include...

MPL упражнения из документации - Boost C++
Если кто читал документацию по MPL, то там в туториале есть раздел с упражнениями по пройденному материалу Exercises. Мне интересно было и...

split mpl::boost - Boost C++
Реализация compile-time алгоритма split для строки. Так как оставлять сообщения в теме...

boost::mpl и метапрограммирование вцелом - Boost C++
Сейчас сижу любуюсь на mpl::vector. template< typename T0, typename T1, typename T2, typename T3, typename T4 , typename...

Сумма во время компиляции, boost::mpl - Boost C++
здравствуйте, пытаюсь понять азы mpl... подскажите в чем разница: template<typename T1, typename T2> struct plus_1 { enum { value =...

mpl проход по элементам - C++
Пытался написать вывод элементов vector_c не через for_each. Не вышло. Кто подскажет как сие сделать наиболее удобно? Пример вектора. ...

3
diagon
Higher
1930 / 1196 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
12.02.2013, 20:31 #2
1) Оно вряд ли скомпилится, слишком много шаблонных инстанцирований будет... Ну, за пару часиков может и скомпилится.
2) Даже первые 100 элементов заполнить не получится из-за того, что результат перестанет влезать в стандартные типы данных. Следовательно, нужно либо вычислять по какому-то модулю, либо использовать длинную арифметику.
0
NeonLost
Пес войны
75 / 86 / 3
Регистрация: 23.02.2012
Сообщений: 653
12.02.2013, 21:09  [ТС] #3
Цитата Сообщение от diagon Посмотреть сообщение
1) Оно вряд ли скомпилится, слишком много шаблонных инстанцирований будет... Ну, за пару часиков может и скомпилится.
2) Даже первые 100 элементов заполнить не получится из-за того, что результат перестанет влезать в стандартные типы данных. Следовательно, нужно либо вычислять по какому-то модулю, либо использовать длинную арифметику.
чет я не подумал...пускай будут не числа фибоначи, а формула i*3cos(45)/2(где i от 1 до 1000)
0
yekka
386 / 150 / 8
Регистрация: 12.05.2011
Сообщений: 450
14.02.2013, 22:07 #4
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Набросал такой код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
#include <algorithm>
#include <iterator>
 
template <long N, long R = 1, long S = 0>
struct CompileTimeArray {
    long value;
    CompileTimeArray<N - 1, R + 1, S + R> tail;
 
    CompileTimeArray() : value(S) {}
};
 
template <long R, long S>
struct CompileTimeArray<0L, R, S> {
    long value;
 
    CompileTimeArray() : value(S) {}
};
 
int main() {
    CompileTimeArray<LENGTH> array;
    long * array_pointer = (long *) &array;
    std::ostream_iterator<long> iter(std::cout, " ");
    std::copy(array_pointer, array_pointer + LENGTH, iter);
    std::endl(std::cout);
}
создаем массив из элементов последовательности http://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{n(n-1)}{2}. Причем значения считаем во время компиляции, а во время исполнения только заполняем массив.

Пример:
Код
$ g++ recur.cpp  -DLENGTH=10 && ./a.out
0 1 3 6 10 15 21 28 36 45
С массивом из 100'000 элементов компилятор возился около шести минут и отожрал под это дело два с половиной гигабайта памяти:
Код
$ time g++ recur.cpp  -DLENGTH=100000 -ftemplate-depth=200000 -finline-limit=200000 -O1

real    5m44.512s
user    5m40.933s
sys     0m2.116s
К сожалению, заставить компилятор проинлайнить все конструкторы мне не удалось. Из 100'000 компилятор проинлайнил только 53759:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
00000000005c19d2 <_ZN16CompileTimeArrayILl99998ELl3ELl3EEC1Ev>:
  5c19d2:   48 83 ec 08             sub    $0x8,%rsp
  5c19d6:   48 c7 07 03 00 00 00    movq   $0x3,(%rdi)
  5c19dd:   48 c7 47 08 06 00 00    movq   $0x6,0x8(%rdi)
  5c19e4:   00
  5c19e5:   48 c7 47 10 0a 00 00    movq   $0xa,0x10(%rdi)
  5c19ec:   00
  5c19ed:   48 c7 47 18 0f 00 00    movq   $0xf,0x18(%rdi)
  5c19f4:   00
  5c19f5:   48 c7 47 20 15 00 00    movq   $0x15,0x20(%rdi)
  5c19fc:   00
  5c19fd:   48 83 c7 28             add    $0x28,%rdi
  5c1a01:   e8 a2 ff ff ff          callq  5c19a8 <_ZN16CompileTimeArrayILl99993ELl8ELl28EEC1Ev>
  5c1a06:   48 83 c4 08             add    $0x8,%rsp
  5c1a0a:   c3                      retq
  5c1a0b:   0f 1f 44 00 00          nopl   0x0(%rax,%rax,1)
Так что при заполнении массива будет совершено более 46000 вложенных вызовов конструкторов.
3
14.02.2013, 22:07
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.02.2013, 22:07
Привет! Вот еще темы с ответами:

Получить индекс типа в mpl::map`е - C++
всем привет. есть mpl карта типов(key -&gt; value). нужно получить индекс типа имея только ключ. где-то накосячил. но непойму где. ...

Для чего нужны /tmp и /var/tmp и какой размер нужен? - Linux
Для чего эти два раздела? /tmp /var/tmp И какой размер делать? Хватит ли если сделать около 100 мегабайт? Или они для копирования...

Поиск русского мануала на датчики TMP 03, TMP 36 - КИП, датчики
У меня небольшая просьба, ищу datasheet на датчики TMP 03, TMP 36, но нахожу только английскую версию с которой я мягко говоря не очень в...

Вирус создаёт файлы tmp.tmp везде. - Удаление вирусов
Вирус прописываеться в системном процессе lsass. Невозможно удалить. Распространяеться по всей облости жёсткого диска и потихоньку сбоит...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru