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

C++

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 153, средняя оценка - 4.83
Evg
Эксперт CАвтор FAQ
17810 / 6016 / 388
Регистрация: 30.03.2009
Сообщений: 16,531
Записей в блоге: 26
#1

Что такое compile-time алгоритмы и для чего они нужны? - C++

28.12.2011, 14:54. Просмотров 18775. Ответов 45
Метки нет (Все метки)

Цитата Сообщение от niXman Посмотреть сообщение
compile-time алгоритмы
А есть от них хоть какая-то практическая польза? По-моему нет
1
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.12.2011, 14:54
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Что такое compile-time алгоритмы и для чего они нужны? (C++):

Compile-time алгоритмы. сборник - C++
всем привет. предлагаю в этой теме обсуждать/реализовывать/выкладывать compile-time алгоритмы. под CUT'ом. подсчет FNV1a-хеш суммы...

.elf и для чего они нужны - C++
Собственно сабж Почитал Вики, как-то для новичка не очень много прояснилось И объясните еще пожалуйста разницу с ехе

Создать список ф-ций определяемых в файле (а-ля initializer list) в compile time - C++
Привет! Хочу как-то регистрировать все ф-ции, объявляемые в файле, например есть вот это std::string f1() { return "asdf1"; } ...

Что такое шейдеры и для чего они нужны? - Видеокарты
Всем привет! Кто сможет описать что такое шейдеры и для чего они нужны только более понятным русским языком(а не скачивая кусок из...

Что такое атрибуты и зачем они? Для чего нужны директивы препроцессора? - C#
Короче,товарищи,задаю вопрос не первый раз,поэтому,если уже отвечали,то прошу прощения,но я забыл уточнить в вопросе то,что мне всё-таки...

Что за драйвера такие, для чего они и нужны ли они вообще? - Драйверы
Что за драйвера такие, для чего они и нужны ли они вообще? 1 Intel SATA Preinstall driver (For AHCI / RAID Mode) Note: Press F6...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
28.12.2011, 15:02 #2
Evg, Во всем есть польза, смотря как это использовать.
Ради примера : http://www.boost.org/doc/libs/1_48_0...tml/ratio.html
0
niXman
Эксперт C++
3135 / 1447 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
28.12.2011, 15:18 #3
Цитата Сообщение от Evg Посмотреть сообщение
есть от них хоть какая-то практическая польза? По-моему нет
ну ты чего?.. как же без компайл-тайм в двух случаях?:
1. алгоритмы оперирующие типами.
2. вынесение ран-тайм задач оперирующих константными данными в компайл-тайм.

Добавлено через 1 минуту
Цитата Сообщение от ForEveR Посмотреть сообщение
Во всем есть польза
тут еще нужно уметь мыслить типами, а не значениями.
0
Evg
Эксперт CАвтор FAQ
17810 / 6016 / 388
Регистрация: 30.03.2009
Сообщений: 16,531
Записей в блоге: 26
28.12.2011, 15:24  [ТС] #4
Цитата Сообщение от ForEveR Посмотреть сообщение
Evg, Во всем есть польза, смотря как это использовать.
Ради примера : http://www.boost.org/doc/libs/1_48_0...tml/ratio.html
Если честно, я не понял, что это пример демонстрирует

Цитата Сообщение от niXman Посмотреть сообщение
ну ты чего?.. как же без компайл-тайм в двух случаях?:
1. алгоритмы оперирующие типами.
2. вынесение ран-тайм задач оперирующих константными данными в компайл-тайм.

Добавлено через 1 минуту

тут еще нужно уметь мыслить типами, а не значениями.
Давай всё-таки не путать писюн с гусиной шеей. Не надо мне рассказывать про полезность шаблонов. Я говорю лишь об алгоритмах, которые через хитроумно написанные шаблоны что-то, зависящее от констант, превращают в другие константы. Какая от этого практическая польза? Желательно с примерами
0
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
28.12.2011, 15:48 #5
Evg,
http://habrahabr.ru/blogs/cpp/86651/

Где-то видео некий большой проект с огромным кол-вом использования буста, в частности mpl/fusion. Ссылку не найду.

Но в продакшне mpl довольно редко используется, что есть то есть.

Добавлено через 8 минут
Пример использования как раз mpl-а есть в либе Arabica - С++ обертка над разными xml-парсерами,
схема DOM, поддержка XSLT, Xpath.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#ifdef HAVE_BOOST
template <typename BaseT, typename DefaultT, typename T0, typename T1>
struct get_param
{
  typedef typename boost::mpl::if_<
      boost::is_base_and_derived<BaseT, T0>
      , T0
      , typename boost::mpl::if_<
            boost::is_base_and_derived<BaseT, T1>
          , T1
          , DefaultT
        >::type
    >::type type;
}; // get_param
#else
Используется к примеру так.

C++
1
2
3
4
5
6
7
8
template <typename string_type, typename T0, typename T1>
struct get_string_adaptor
{
  typedef typename get_param<Locale::string_adaptor_tag, 
                             Locale::default_string_adaptor<string_type>, 
                             T0, 
                             T1>::type type;
};
Таким образом нам пофигу каким параметром передавать адаптер для работы со строками, хоть в первом, хоть во втором, а можем и вообще не передавать (используя структуру nil_t).
0
niXman
Эксперт C++
3135 / 1447 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
28.12.2011, 16:02 #6
Цитата Сообщение от Evg Посмотреть сообщение
об алгоритмах, которые через хитроумно написанные шаблоны что-то, зависящее от констант, превращают в другие константы.
в одном моем проекте распределенной сети вычислительных единиц, я использовал компайл-тайм генерацию хеш сумм имен процедур для того, чтоб эту хеш сумму использовать в mpl::map<> для получения типа сериализатора/десериализатора для каждой конкретной процедуры.

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

Добавлено через 4 минуты
так же, некий мой товарищ, при работе с CUDA использует mpl для генерации таблиц и матриц из некоторых изначальных значений.

Добавлено через 4 минуты
еще, меня постоянно веселят записи в чьем-то коде типа "var = sqrt(1.7)"
спрашивается, для чего постоянно считать значение, если оно неизменно?
2
Evg
Эксперт CАвтор FAQ
17810 / 6016 / 388
Регистрация: 30.03.2009
Сообщений: 16,531
Записей в блоге: 26
28.12.2011, 16:13  [ТС] #7
ForEveR, из всего того, что ты привёл, я не увидел того, что является compile-time алгоритмом в том смысле, в котором его понимает ТС (если я правильно его понял). "Технология, построенная на шаблонах" и "compile-time алгоритмы, построенные на шаблонах" - это как бэ две разные вещи

Цитата Сообщение от niXman Посмотреть сообщение
1. снижение производительности
На сколько сотых долей процента это дело ускорило работу программы?

Цитата Сообщение от niXman Посмотреть сообщение
2. отлов ошибок в ран-тайм. что не очень приятно.
Отлов ошибок в наношаблоных алогритмах, которые как бы чего-то считают в compile-time - ещё более сложная задача, потому что этот процесс работы компилятора ты не можешь ни оттрасировать, ни отладочными печатами пощупать

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

Единственный полезный случай, который с ходу лезет в голову - это вычисление инициализатора для const переменных. Очень часто хочется сделать так, чтобы записать что-то в переменную один раз и чтобы больше переменную не менять. Для автоматических переменных это всё нормально рулится квалификатором const, а вот для статических не всегда получается. При этом бывают случаи, что значение переменной в приницпе можно было бы вот через такие пляски с бубнами вычислить. Но а других полезных практических применений я с ходу не вижу.

Добавлено через 50 секунд
Цитата Сообщение от niXman Посмотреть сообщение
еще, меня постоянно веселят записи в чьем-то коде типа "var = sqrt(1.7)"
спрашивается, для чего постоянно считать значение, если оно неизменно?
И как же это сделать через compile-time алгоритмы?
0
niXman
Эксперт C++
3135 / 1447 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
28.12.2011, 16:18 #8
почитай Александреску.

Добавлено через 1 минуту
Цитата Сообщение от Evg Посмотреть сообщение
И как же это сделать через compile-time алгоритмы?
соответствующим шаблоном.
вот только записываться это будет как "var = sqrt<1,7>::value"

Добавлено через 51 секунду
Цитата Сообщение от Evg Посмотреть сообщение
На сколько сотых долей процента это дело ускорило работу программы?
на 6 процентов.

Добавлено через 39 секунд
Цитата Сообщение от Evg Посмотреть сообщение
Отлов ошибок в наношаблоных алогритмах, которые как бы чего-то считают в compile-time - ещё более сложная задача
но это делается один раз при написании шаблона. а не каждый раз при его использовании.
0
Evg
Эксперт CАвтор FAQ
17810 / 6016 / 388
Регистрация: 30.03.2009
Сообщений: 16,531
Записей в блоге: 26
28.12.2011, 16:20  [ТС] #9
Цитата Сообщение от niXman Посмотреть сообщение
соответствующим шаблоном.
вот только записываться это будет как "var = sqrt<1,7>::value"
А готовый пример написать можно?

Цитата Сообщение от niXman Посмотреть сообщение
на 6 процентов
На каком интервале времени? Если 6% на времени в 1 секунду, то это не показатель, если 6% на времени исполнения в 1 час, то тут речь может идти только о плохой первоначальной реализации

Добавлено через 48 секунд
Цитата Сообщение от niXman Посмотреть сообщение
но это делается один раз при написании шаблона. а не каждый раз при его использовании
Ой не факт... Вполне можно доизголяться до того, что при одних константах у тебя будет нормально работать, а при других будет работать ненормально. Да и run-time принормальной работе тоже делается только один раз
0
niXman
Эксперт C++
3135 / 1447 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
28.12.2011, 16:30 #10
Цитата Сообщение от Evg Посмотреть сообщение
На каком интервале времени? Если 6% на времени в 1 секунду, то это не показатель, если 6% на времени исполнения в 1 час, то тут речь может идти только о плохой первоначальной реализации
в 1 секунду.
дело в том, что каждый узел сети имеет производительность на пустых операциях - ~740 000. теперь это значение умнож на два(запрос/ответ).

изначально в реализации я использовать std::map<>. затраты на получения конкретного сериализатора/десериализатора составляли 13 процентов. при замене его на std::unordered_map<> затраты составили 6 процентов. с компайл-тайм картой - 0 процентов.

Добавлено через 1 минуту
Цитата Сообщение от Evg Посмотреть сообщение
при одних константах у тебя будет нормально работать, а при других будет работать ненормально.
ну дык! шаблон значит криво закожен. (если мы все еще о нем)

Добавлено через 2 минуты
Цитата Сообщение от Evg Посмотреть сообщение
А готовый пример написать можно?
сходу не получится. ибо нужно продумать способ сохранения лидирующих нулей в обеих составляющих...
0
Evg
Эксперт CАвтор FAQ
17810 / 6016 / 388
Регистрация: 30.03.2009
Сообщений: 16,531
Записей в блоге: 26
28.12.2011, 16:37  [ТС] #11
Цитата Сообщение от niXman Посмотреть сообщение
в 1 секунду
Не показатель. Это всего лишь говорит о том, что в программе слишком маленькая полезная нагрузка. Т.е. условно говоря можно сравнить коды

C
1
x = sqrt (4.0);
и

C
1
x = 2.0;
и сказать, что подстановка константы ускорила программу в сотни раз. Но проблема в том, что такой фрагмент кода он вычисляется всего лишь один раз и в большой длинной программе стократная разница времени работы этих двух фрагментов будет не ощутима.

Кстати, ты так и не написал кода с compile-time вычислением корня

Цитата Сообщение от niXman Посмотреть сообщение
ну дык! шаблон значит криво закожен. (если мы все еще о нем)
А чем принципиально отличается криво закоженный шаблон от криво закоженного run-time алогритма? По-моему ничем
0
niXman
Эксперт C++
3135 / 1447 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
28.12.2011, 16:37 #12
Evg, если кратко: посмотри на этот список. как ты думаешь, этому нет применения?
0
Evg
Эксперт CАвтор FAQ
17810 / 6016 / 388
Регистрация: 30.03.2009
Сообщений: 16,531
Записей в блоге: 26
28.12.2011, 16:39  [ТС] #13
Цитата Сообщение от niXman Посмотреть сообщение
сходу не получится. ибо нужно продумать способ сохранения лидирующих нулей в обеих составляющих...
Ну вот о чём и я. Зачем извращаться и из принципа что-то делать в compile-time, когда по простому это можно сделать в run-time. Благо язык Си++ тут даёт больше возможностей, чем Си

Добавлено через 32 секунды
Цитата Сообщение от niXman Посмотреть сообщение
Evg, если кратко: посмотри на этот список. как ты думаешь, этому нет применения?
Там нет compile-time алгоритмов

Добавлено через 55 секунд
Если я правильно понимаю твой термин "compile-time алгоритм"
0
niXman
Эксперт C++
3135 / 1447 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
28.12.2011, 16:39 #14
Цитата Сообщение от Evg Посмотреть сообщение
ты так и не написал кода с compile-time вычислением корня
читай предыдущий пост.

Цитата Сообщение от Evg Посмотреть сообщение
чем принципиально отличается криво закоженный шаблон от криво закоженного run-time алогритма?
тем что шаблон пишется один раз, а используется множество раз. а т.к. существует проверка в компайл-тайм, то при ошибке использования ты и получишь ошибку компиляции, а не в ран-тайм.
0
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
28.12.2011, 16:40 #15
Evg, http://habrahabr.ru/blogs/cpp/124963/ на тему корня.
2
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.12.2011, 16:40
Привет! Вот еще темы с ответами:

Что такое векторы, и для чего нужны? - C++
читаю читаю но ответа в книге зачем нужны вектора так и не могу найти!!! пожалуйста напишите пример!! что бы я понял! спасибо!

Что такое Ant и Struts, и для чего нужны? - JAVA IDE
Доброго времени суток! Во многих IDE очень много упоминается про Ant и Struts. Хотелось бы узнать по подробнее от профессионалов, что...

Compile - time алгоритмы - C++
мне итересно, с появлением constexpr надобность в шаблонных компиле-тайм алгоритмах полностью отпала?..)

Объясните человеческим языком мне чайнику что такое singleton, статический класс. Зачем они нужны. Что рекомендуете прочитать мне для начала - C++
Объясните человеческим языком мне чайнику что такое singleton, статический класс. Зачем они нужны. Что рекомендуете прочитать мне для...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
28.12.2011, 16:40
Ответ Создать тему
Опции темы

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