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 };
};

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

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

> или в С++ оно кривое?

В с++.


А, вот так. Тогда, в каких языках, которые могли бы рассматриваться в качестве альтернативы C++, оно не кривое?

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

> а при чем тут альтернатива с++?

Как причём? Всё же познаётся в сравнении. Что бы говорить «кривое», надо показать и «прямое». Но показывать, например, на Smalltalk совершенно не корректно, ибо он просто не соответствует тем целям, которые ставились при разработке дизайна С++.

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

Вот я и хочу увидеть язык, который бы мог являться альтернативой C++ и при этом имел бы «прямое» ООП. По мне так ООП в С++ очень даже прямое, если принимать во внимание набор объективных требований, которые к нему предъявлялись, а не просто измышлять в вакуумно-сферически терминах.

archimag ★★★
()
Ответ на: комментарий от ky-san

> ООП довольно ущербная модель

А какие есть менее ущербные модели для поддержки «объектной декомпозиции»?

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

Не совсем понял вопроса. Есть более общая (и менее ущербная) «функциональная декомпозиция».

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

> Есть более общая (и менее ущербная) «функциональная декомпозиция»

Хм, вы серьёзно собираетесь утверждать, что «функциональная декомпозиция» является более общей? Это какое-то новое слово в CS? Или просто чего-то не того съели?

Кстати, помните, что когда Страуструп рекламировал С++ (ещё в 80-ых), то говорил, что вот наконец можно избавится от подхода на базе потоков (т.е. функционального) и наконец пользоваться удобной объектной моделью.

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

http://en.wikipedia.org/wiki/Decomposition_%28computer_science%29

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

Он же не смог реализовать удобную объектную модель, много чего не сделал. Как же ей можно пользоваться?

И советую полистать с «objects have failed». Если не обращать на передёргивания - очень много по делу, т.е. хотели как лучше - получилось как всегда.

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

> http://en.wikipedia.org/wiki/Decomposition_%28computer_science%29

Мда, мощная ссылка. И к чему она?

Он же не смог реализовать удобную объектную модель


В каком смысле неудобную? Это что критерий такой? Если у меня будет выбор на чём писать, на С или на С++, то я безусловно выберу С++.

Всё же, в каком языке, имеющим одинаковую с С++ область применения ООП реализовано лучше? А то мне не нравится сравнивать слона с китом. Хотя, пока вообще не ясно с чем идёт сравнение.

И советую полистать с «objects have failed».


Какая-нибудь конкретика сегодня будет? На С++ написано огромное количество софта, его используют огромное количество людей. Этот как бы факты. Противопоставлять этому какие-то общие рассуждения, на тему «в мире нет ничего идеального» как-то нелепо.

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

> Мда, мощная ссылка. И к чему она?

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

В каком смысле неудобную? Это что критерий такой?

Вот твои слова:

> избавится от подхода на базе потоков (т.е. функционального) и наконец пользоваться удобной объектной моделью.

Сам же начал употреблять расплывчатые слова, а теперь катишь бочку на меня?

На С++ написано огромное количество софта, его используют огромное количество людей. Этот как бы факты. Противопоставлять этому какие-то общие рассуждения, на тему «в мире нет ничего идеального» как-то нелепо.

В огороде бузина, в Киеве дядька. Потрудись писать связно и по теме.

имеющим одинаковую с С++ область применения ООП реализовано лучше?

C++0x

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

> К тому, чтоб ты прошёл, почитал статью и ссылки.

Я прочитал, автор статьи явно некомпетентен. Давай начнём с SICP?

Потрудись писать связно и по теме.


Я то пишу по теме, а вот не можешь ничего сказать конкретного, кроме того, что С++ типа г.. На С++ легко нападать, но только противопоставить ему нечего.

C++0x


Круто.

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

> имеющим одинаковую с С++ область применения ООП реализовано лучше?

C++0x

наркоманы в треде :)

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

Если у меня будет выбор на чём писать, на С или на С++, то я безусловно выберу С++.

*YOU* are full of bullshit.

-- Linus Torvalds

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

> Я прочитал, автор статьи явно некомпетентен.

Исправь

Давай начнём с SICP?

Начни.

Я то пишу по теме

Ты пишешь в теме. Но не по теме.

вот не можешь ничего сказать конкретного

Я писал, что не буду копипастить ничего. Не хочешь читать - досвидания.

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

> Он же пишет ядро, а не прикладной софт.

git

Легко судить о том, чем никогда не занимался.

Легко судить о том, о чём не знаешь.

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

> *НЕ* всё есть объект.

Здорово. Мы так сейчас до понятия «объективной действительности» доберемся.

Если выбранный подход к декомпозиции предполагает, что «всё есть объект», то всё есть объек. К.О. 2

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

> Давай начнём с SICP?

Начни.


В SICP утверждается, что за всё время было придумано только два подхода к декомпозиции: объектная и функциональная, которые глубоко различны между собой. Структурная декомпозиция, как и ООП, это, очевидно, представители объектного подхода. А статья по ссылку полная туфта.

Я писал, что не буду копипастить ничего.


Специально для этого здесь придумали ссылки, ага.

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

> что Вас здесь-то не устраивает?

*НЕ* всё есть объект.

прям тред-детектор :)

а в питоне всё, и что?

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

> Как причём? Всё же познаётся в сравнении. Что бы говорить «кривое», надо показать и «прямое». Но показывать, например, на Smalltalk совершенно не корректно, ибо он просто не соответствует тем целям, которые ставились при разработке дизайна С++.

Ну если речь об этом, то для с++-задач ООП не нужно. А если нужно ООП - то не нужно с++.

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

> ядро, а не прикладной софт.

А вы собираетесь писать прикладной софт на с++? почему не на ассемблере?

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

> для с++-задач ООП не нужно. А если нужно ООП - то не нужно с++.

Осталось только понять, почему ваше экспертное заключение не разделяют ведущие специалисты отрасли.

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

Давайте для начала определимся - а для каких вообще задач следует использовать с++? Мне кроме геймдева ничего в голову не приходит.

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

Кстати, этот факт (то что с++ в геймдеве) на мой взгляд основная причина популярности с++ (если не единственная вообще). не было бы геймдева никто бы про с++ и не знал.

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

> этот факт (то что с++ в геймдеве) на мой взгляд основная

причина популярности с++


Значит, инженеры Miscrosoft, Apple, Google, Adobe, Autodesk и далее, далее, далее, насколько сильно любят геймдев, что притащили оттуда С++ в свои ключевые проекты? Вот оно как.

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

> а для каких вообще задач следует использовать с++?

Нельзя просто и чётко выделить область применения, но есть несколько факторов, влияющих на выбор разработчиков:

* Высокая производительность, при необходимости на уровне С.
* Лёгкость распространения решений в бинарном виде.
* Наличие большого количества качественных библиотек
* Значительнее большая эффективность разработки, чем на С, но только при условии наличия необходимого количества квалифицированных (в области С++) специалистов. Данный пункт не способствует использованию C++ в open source проектах (в которых принимает участие большое количество людей самого разного уровня), но часто верен для больших компаний (которые лидеры индустрии).

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

> А вы собираетесь писать прикладной софт на с++? почему не на ассемблере?

потому-что на С и С++ удобней ассемблера, и да - прикладной софт чуть сложнее калькулятора, уже имеет определенные требования к быстродействию, от консольных утилит до IDE, СУБД, браузеров, кадов и пр.

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

Ну скажем compiz-0.9 переписали с plain C на С++ почему-то... Вот дураки, правда... ?

SergikXP
()

Я C++ не очень-то знаю, но первый вариант как-то полаконичнее выглядит. Наверное, он и лучше :)

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

ой-ой-ой, тушоночная невеста нас всех тут разоблачила (с)

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

факт (то что с++ в геймдеве) на мой взгляд основная причина популярности с++ (если не единственная вообще). не было бы геймдева никто бы про с++ и не знал.

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

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

Ну так какая область разработки требует производительности, сравнимой с С, и в то же время позволяет извлечь профит из ООП?

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

> от консольных утилит до IDE, СУБД, браузеров, кадов и пр.

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

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

>> от консольных утилит до IDE, СУБД, браузеров, кадов и пр.

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


IDE - QtCreator намного быстрее аналогов на Java
СУБД - порой и скорости С не хватает
браузеры - аналогично
кады - аналогично

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

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

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

> что подтверждается наличием соответствующего софта, который вполне

себе используется


Можно примеры софта, что бы понять о чём речь?

А если программы А и В дают достаточную производительность


Как вы определяете достаточную производительность? Например, если речь идёт о Photoshop или каком-нибудь Autocad?

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

> Как вы определяете достаточную производительность?

Так, как ее определяют разработчики.

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

> что и меньшей производительности _достаточно_

пройдемся опять по списку :)

IDE - NetBeans code assistance дохнет на парсинге заголовков wxWidgets + GTK + что там по зависимостям, Eclipse отъедает пару Гб ОЗУ и долго шуршит, QtCreator - практически мгновенно парсит, памяти ест намного меньше, автодополнение лучше всех
СУБД - от больших до малых С и С++ рулят во все поля
браузеры - смотри СУБД
кады - аналогично

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

aho
()

Унылый какой-то тред получился.

Если бы shty не стал выебы*ваться как дурачек на первых страницах, все было бы намного интереснее.

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