LINUX.ORG.RU

Шаблонное программирование в C++ и хвостовая рекурсия


0

3

Есть ли смысл при программировании на шаблонах применять хвостовую рекурсию?

Например, что лучше:

template <int n>
struct Fac
{
    enum { result = n * Fac<n - 1>::result };
};

template <>
struct Fac<0>
{
    enum { result = 1 };
};

или

template <int n>
class TailFac
{
    template <int counter, int mul>
    struct TailFacIter
    {  
        enum { value = TailFacIter<counter - 1, mul * counter>::value };
    };

    template <int mul>
    struct TailFacIter<0, mul>
    {  
        enum { value = mul };
    };

public:
    enum { result = TailFacIter<n - 1, n>::value };
};

Даст ли второй подход меньшее потребление памяти и большую скорость компиляции?

Хвостовая рекурсия и шаблоны, как мило +)

Только сдается мне толку от этого никакого - как генерилось дофига классов, так и будет генерится.

yoghurt ★★★★★
()

при мета-программировании на шаблонах имеет смысл использовать boost::mpl,

а по сабжу - зависит от компилятора.

nikitos ★★★
()

> что лучше

Лучше выбрать какой-то другой язык для метапрограммирования. Или заюзать boost::mpl, раз уж совсем невтерпеж.

Даст ли второй подход меньшее потребление памяти и большую скорость компиляции?

Как уже сказано выше, зависит от компилятора.

V_L_A_D ★★
()

С точки зрения «банальной эрудиции», во втором примере для каждого факториала будет налеплено n классов, а в первом примере будет всего n_max классов, где n_max - максимальное число от которого считался факториал. Если б я был компилятором, я б сказал что для меня первый пример проще;-)

AIv ★★★★★
()
Ответ на: комментарий от yoghurt

> Циклы во время компиляции?

Нормальный оптимизирующий компилятор прогоняет цикл, если это возможно, уже на этапе компиляции. Для примера: создай inline-функцию, вычисляющую факториал в цикле и вызови ее для константы - нормальный компилятор сразу заменит вызов на результат.

PS: кстати, где в исходном сообщении сказано про этап компиляции? Там речь вообще про потребление памяти идет...

anonymous
()

Это не хвостовая рекурсия.

Хвостовую рекурсию следует применять там, где она оптимизируется в переход, а не вызов функции.

anonymous
()
Ответ на: комментарий от kulti

> Чтоб не считать в рантайме то, что уже известно на этапе компиляции.

Чтобы не считать в рантайме заведи себе таблицу факториалов и не городи всякую чушь на шаблонах (благо кол-во факториалов, которые можно запихнуть в стандартную разрядную сетку очень небольшое).

anonymous
()
Ответ на: комментарий от RedPossum

> А зачем вообще может понадобиться всё это на этапе компиляции?

Скорее всего автор просто начитался каких-то «умных» книжек и решил блеснуть своими знаниями - школота, что с нее взять?! )))

anonymous
()
Ответ на: комментарий от RedPossum

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

AIv ★★★★★
()

если Вы внимательно посмотрите на свой код, то увидите что первый вариант от второго ничем по сути не отличается, фактически второй вариант выглядит так: взят первый вариант и обёрнут в класс

для решения данной задачи второй вариант не нужен, для решения более сложных задач - возможно и сгодится

shty ★★★★★
()
Ответ на: комментарий от anonymous

Спасибо КО! Только ты это не мне говори, а ТС. Плюс откуда-то ведь нужно такие таблицы брать (факториал тут явно для примера)? Может, человек никаких других языков не знает, вот и пытается извернуться на том, что есть.

kulti ★★
()
Ответ на: комментарий от kulti

> Плюс откуда-то ведь нужно такие таблицы брать (факториал тут явно для примера)?

Если нет готовых табличных данных, то пишется программа которая вычисляет необходимые данные, а затем эти данные оформляются в таблицу.

Может, человек никаких других языков не знает, вот и пытается извернуться на том, что есть.

Люлей надо тогда ему отвесить, чтобы он начал мыслить разностороне.

anonymous
()
Ответ на: комментарий от anonymous

Если нет готовых табличных данных, то пишется программа которая вычисляет необходимые данные, а затем эти данные оформляются в таблицу.

Закат Солнца вручную.

ugoday ★★★★★
()
Ответ на: комментарий от anonymous

Если нет готовых табличных данных, то пишется программа которая вычисляет необходимые данные, а затем эти данные оформляются в таблицу

Я так понял ТС такую программу и писал, да призадумался...

kulti ★★
()
Ответ на: комментарий от kulti

Ты неправильно понял. Факториал я привел для примера, вопрос изначально возник при чтении Александрески про списки типов.

zombiegrinder_6000
() автор топика

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

dave ★★★★★
()
Ответ на: комментарий от dave

>Вот, лежит у меня на столе книга Александреску, но душу она как-то совсем не греет

Сборник костылей, да, но раз уж начал читать, не бросать же теперь. К тому же паттерны проектирования и в других языках пригодятся.

zombiegrinder_6000
() автор топика
Ответ на: комментарий от zombiegrinder_6000

Дочитать, конечно, надо. Поддерживаю. Есть там интересные главы. Мне понравилась про аллокатор.

dave ★★★★★
()
Ответ на: комментарий от zombiegrinder_6000

> Ты обосрался, пятый курс.

Школота это уровень развития и ей можно оставаться всю жизнь.

anonymous
()
Ответ на: комментарий от zombiegrinder_6000

> К тому же паттерны проектирования и в других языках пригодятся.

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

PS: здесь уже была где-то тема про то, что паттерны проектирования это недостатки тех или иных языков программирования

anonymous
()
Ответ на: комментарий от ugoday

Вы ни разу не видели кодогенераторов? Где «вручную»-то? Что в случае с шаблонами, что в случае с кодогенератором - пишется код для генерации «таблиц»

anonymous
()
Ответ на: комментарий от dave

Вот, лежит у меня на столе книга Александреску, но душу она как-то совсем не греет.

а должна?

shty ★★★★★
()
Ответ на: комментарий от anonymous

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

спасибо, Кэп

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

идиотия

shty ★★★★★
()
Ответ на: комментарий от zombiegrinder_6000

И ты сделал вывод о том что я школота из сабжа?

нет, вывод сделан по тому как ты пытаешься оправдаться (вот например этой фразой)

shty ★★★★★
()
Ответ на: комментарий от zombiegrinder_6000

Ну давай цепочку рассуждений, которые привели тебя к такому выводу.

какая тут цепочка, посмотри на свои ответы :) а потом возьми зайди в поиск и посмотри как, к примеру tailgunner, обращается со словом «школота»

shty ★★★★★
()
Ответ на: комментарий от shty

> > здесь уже была где-то тема про то, что паттерны проектирования это недостатки тех или иных языков программирования

идиотия

Видимо речь шла о небогатых стандартных библиотеках/фичах языка, раз базовые вещи приходится делать руками. (Пример - синглтон/фабрика в С++ против методов класса в ObjC - здесь в С++ «паттерны» являются некоторыми «костылями», для создания вменяемого окружения)

Сформулированно да, криво.

-- the other anonymous

anonymous
()
Ответ на: комментарий от anonymous

Видимо речь шла о небогатых стандартных библиотеках/фичах языка, раз базовые вещи приходится делать руками. (Пример - синглтон/фабрика в С++ против методов класса в ObjC - здесь в С++ «паттерны» являются некоторыми «костылями», для создания вменяемого окружения)

эм, паттерны проектирования - это просто best practices, так сказать мудрость сенсеев, решения которые сработали, не более того, те же, кто ждёт от сравнительно низкоуровневых языков наличия кнопки «сделать всё красиво» - либо выбрал не ту профессию, либо занимается не своим делом

shty ★★★★★
()
Ответ на: комментарий от shty

> эм, паттерны проектирования - это просто best practices, так сказать мудрость сенсеев, решения которые сработали, не более того

Вы о чём? Какой, к чёрту, мудростью сенсеев или «best practices» пахнет в pattern singleton?

Это костыль, позволяющий в недоязыках делать то, что в нормальных языках есть «из коробки». Не более того.

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

те же, кто ждёт от сравнительно низкоуровневых языков наличия кнопки «сделать всё красиво» - либо выбрал не ту профессию, либо занимается не своим делом

Бред. Сравни ObjectiveC & C++. Они оба «сравнительно низкоуровневые» (С) ты. Но в одном из ООП делается через ж-пу (там даже нет примитива для посылки сообщения объекту), в другом всё юзабельно.

anonymous
()
Ответ на: комментарий от anonymous

Это костыль, позволяющий в недоязыках делать то, что в нормальных языках есть «из коробки»

для Вас специально, повторюсь - тот же, кто ждёт от сравнительно низкоуровневых языков наличия кнопки «сделать всё красиво» - либо выбрал не ту профессию, либо занимается не своим делом

В случае с C++ - плотность использования костылей зашкаливает

я нахожусь в некотором смущении, интересно что будет если Вам показать assembler, ну или рассказать, что можно писать в машинных кодах? :)

Сравни ObjectiveC & C++. Они оба «сравнительно низкоуровневые»

ога, и C# тоже низкоуровневый

shty ★★★★★
()
Ответ на: комментарий от shty

Вы бы хоть GOF'a для начала почитали:

«Выбор языка программирования безусловно важен... Если бы мы ориентировались на процедурные языки, то включили бы паттерны наследование, инкапсулялия и полиморфизм». Некоторые из наших паттернов напрямую поддерживаются менее распространенными языками. Так, в CLOS есть мультиметоды, которые делают ненужным паттерн посетитель."

anonymous
()
Ответ на: комментарий от shty

> для Вас специально, повторюсь - тот же, кто ждёт от сравнительно низкоуровневых языков наличия кнопки «сделать всё красиво» - либо выбрал не ту профессию, либо занимается не своим делом

Тот кто пишет на низкоуровневых языках, там где можно писать на высокоуровневых - либо выбрал не ту профессию, либо занимается не своим делом

anonymous
()
Ответ на: комментарий от shty

> я нахожусь в некотором смущении, интересно что будет если Вам показать assembler, ну или рассказать, что можно писать в машинных кодах? :)

Ничего не будет.

> Сравни ObjectiveC & C++. Они оба «сравнительно низкоуровневые»

ога, и C# тоже низкоуровневый

Я не вижу в своём посте ни слова про С#. Может, у вас проблемы со зрением и стоит посетить доктора?

для Вас специально, повторюсь - тот же, кто ждёт от сравнительно низкоуровневых языков наличия кнопки «сделать всё красиво» - либо выбрал не ту профессию, либо занимается не своим делом

Ещё раз, для альтернативно-одарённых индивидуумов. Оба языка - ObjectiveC & C++ в одинаковой мере низкоуровневые. Но в одном языке есть нужда сторонних костылях, в другом - нет. Что может быть непонятно?

anonymous
()
Ответ на: комментарий от anonymous

> для Вас специально, повторюсь - тот же, кто ждёт от сравнительно низкоуровневых языков наличия кнопки «сделать всё красиво» - либо выбрал не ту профессию, либо занимается не своим делом

Тот кто пишет на низкоуровневых языках, там где можно писать на высокоуровневых - либо выбрал не ту профессию, либо занимается не своим делом

спасибо, Кэп :)

shty ★★★★★
()
Ответ на: комментарий от shty

Тебе говорили (не я) о разнице в языках. Никаких best practices & мудрости сенсеев в дописывании разработчиками ручками стандартных библиотек/окружения/рантайма *НЕТ*.

Это всего лишь означает, что язык, библиотек и окружение были криво спроектированны.

anonymous
()
Ответ на: комментарий от shty

> обоснуйте

Они поддерживают все те же , что и «низкоуровневый» Си. Валидная программа на C может быть собранна компилятором ObjC & C++. Оба языка поддерживают С FFI

anonymous
()
Ответ на: комментарий от zombiegrinder_6000

Тебя не спросить забыли. Перечитай и посмотри, о чём идёт речь. Если не поймёшь - пиши, тебе объяснят.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.