Форум программистов, компьютерный форум, киберфорум
Наши страницы
Boost C++
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
NeonLost
Пес войны
110 / 87 / 22
Регистрация: 23.02.2012
Сообщений: 653
1

tmp with mpl

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

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

MPL push_back
А как тут push_back пользоваться?#include <iostream> #include <type_traits> #include...

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

MPL упражнения из документации
Если кто читал документацию по MPL, то там в туториале есть раздел с упражнениями по пройденному...

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

Сумма во время компиляции, boost::mpl
здравствуйте, пытаюсь понять азы mpl... подскажите в чем разница: template<typename T1, typename...

3
diagon
Higher
1937 / 1203 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
12.02.2013, 20:31 2
1) Оно вряд ли скомпилится, слишком много шаблонных инстанцирований будет... Ну, за пару часиков может и скомпилится.
2) Даже первые 100 элементов заполнить не получится из-за того, что результат перестанет влезать в стандартные типы данных. Следовательно, нужно либо вычислять по какому-то модулю, либо использовать длинную арифметику.
0
NeonLost
Пес войны
110 / 87 / 22
Регистрация: 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 / 16
Регистрация: 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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.02.2013, 22:07

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

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

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


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

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

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