LINUX.ORG.RU

C++11 и управление памятью

 , ,


0

8

Прочитал недавно о смарт-поинтерах в C++11. Можно ли считать это полноценной заменой GC используемых другими языками программирования, такими как Java/C#? Какие современные компиляторы полноценно поддерживают C++11? Есть ли полноценная поддержка C++14?

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

У дитя просто современный автоматический туалет!

Раскрой аналогию. А то я не понял.

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

При этом если я в сишке взял свой трон - выкинул его. Создал себе хату и для неё инстанс аллокатара - я могу её засирать как угодно - после я просто ресетну хату и у меня чисто.

Ахренеть, царь знает о пулах. Может, он даже не дебил?

Технологии у меня

А нет, всё же дебил.

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

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

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

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

В крестах-то что не так? Там только RAII и обычный подсчет ссылок

Я ниже для кого писал:

Т.е. ты срёшь, а потом рантайм как бы выполняет обратную операцию в обратном порядке. Посрал ты 1000500 раз - он обратнопосрал те же 1000500. Ахренеть. Просто новые технологии.

Это убожество для даунов. Вменяемые люди так не пишут, но среди крестовиков ради есть вменяемые? Полтора человека на сто тысяч?

Даже гц не настолько ущербен как RAII-параша в цэпэпэ

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

Верно. Но если тебе нужно стрелять прямо сейчас, то лучше иметь готовый ствол.

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

Тем более, что то, что ты соберешь на коленке, будет хуже. Поэтому ты берешь ствол(готовый), а создаешь что-то другое.

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

Ты можешь использовать готовый ствол - это хорошо, но ты должен быть его достоин, если ты не достоин - ты бесполезен, ты обезьяна.

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

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

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

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

Никто не умеет решать задачи, никто не умеет думать - единственное «умение», которое вдалбливают обезьяне - это по методичке сводить задача к общему виду и юзать готовое решение.

Типичный мир жабистов - надо передать 3строчки - запихни в хмл.

Адепт абсолютно не представляет и не понимает что он вообще делает - он просто пастит готовое говно.

В целом аналогия со стволом не полная - ведь мир программирования - это мир создания стволов, а готовый рантайм - это детали и сопряжения.

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

Вот так и выходит. Не могу писать - жопу разрывает на молекулы.

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

Ахренеть, царь знает о пулах. Может, он даже не дебил?

Это не пулы. Это просто ресет хипа, т.е. обычный стек.

А нет, всё же дебил.

Ога, уж явно нулёвый балабол способен оценить моё величие. Прям вот может каждый раз.

Почему ты постоянно агришся на меня - я же пошутил, а ты. Даже намекнул тебе на шутку сердечком, а ты. Ты всё ещё отказываешься со мною дружить?

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

А вот ГЦ и крестопомойка - это именно выгребание говна.

не надо мешать в кучу ГЦ и плюсы. это далеко не одно и то же. в плюсах «управление памятью» всего лишь написанные для ленивых программистов библиотечные функции, не влияющие на сам язык, на компилятор или на распределение памяти в программе.

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

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

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

Вменяемые люди так не пишут

Как так? Тут, как и в С, все зависит от тебя. Ты же не ругаешь сишку за то, что там можно вызывать 100500 раз malloc и 100500 раз free. Никакой разницы с твоим примером...

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

Поэтому сливы твои на «не юзай» - не работают, ибо я повелитель, а ты дерьмо. Я могу, а ты нет. Для тебя это замена мозга, а для меня - моя воля и мощь.

Неплохо. Напомнило https://www.youtube.com/watch?v=B7tMgmxzSkY&feature=youtu.be&t=226

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

Никакой разницы с твоим примером...

Разница есть. Давай начнём по-порядку.

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

Т.е. если ты хочешь писать на крестах по-пацански, то ты вынужден писать на кастрированном си, а зачем мне нужен кастрированный си, если проще писать на си?

Ты же не ругаешь сишку за то, что там можно вызывать 100500 раз malloc и 100500 раз free.

Ругаю.

Я не нашел в крестах ни одной фичи, которая бы хоть как-то бала полезна с т.з. написания вменяемого кода. Писать дерьмо просто чтобы приемлемо работало - кресты тут вне конкуренции. Может ты мне её назовёшь?

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

не надо мешать в кучу ГЦ и плюсы. это далеко не одно и то же. в плюсах «управление памятью» всего лишь написанные для ленивых программистов библиотечные функции, не влияющие на сам язык, на компилятор или на распределение памяти в программе.

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

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

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

Это просто ресет хипа, т.е. обычный стек.

Феерично.

Почему ты постоянно агришся на меня

Мне просто нравится тебя гнобить по мере сил.

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

ну, выкидывать не обязательно всё и сразу. например, шаблоны нужны исключительно для экономии места в коде, например. многие концепции в них удобно реализовывать, без необходимости писать километры кода. и особенно меня радуют variadic templates. с ними стало ещё удобнее и приятнее писать некоторые конструкции.
насчёт классов - мне лично пофигу. в моих задачах они практически не нужны. можно притянуть за уши, но без особого профита. крайне редко можно найти задачи под действительно обоснованное использование наследования и перегрузок. но иногда они полезны. особенно для тех, кто возится с гуями. тру-ооп со структурками проходила, в прошлом. но как-то это нудно, однако. а по скорости выходит то же самое.
не самом деле, даже эти пресловутые «умные» указатели не сжирают ресурс особо. память - немного да. а проц - ну, на тысячные доли процента медленнее обращения к ним. в общем, на практике это незаметное замедление даже на высоконагруженных серверах. так что даже на это можно забить, если речь идёт о развесистом и многопоточном обмене данными и бывает сложно отследить, где нужно уничтожать объект. кстати, сегодня целый день ловила утечки памяти и объектов ядра в большом чужом чисто сишном коде. выловила и искоренила. но это та ещё развлекуха!
меня в играние с кодом особо не затягивает. я просто использую плюсы для довольно шустрой разработки кода, когда кода много и на С разработка может слишком затянуться. я могу играться, отвечая на вопросы на форумах или просто в тестовых программках, которые я пишу ради эксперимента. иногда я тестирую скорость разных реализаций, оптимизацию в разных компиляторах, проверяю возможность реализации через определённые конструкции языка, и т.д. такие игрушки довольно полезны, когда надо выбрать ту или иную реализацию.

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

Я не нашел в крестах ни одной фичи, которая бы хоть как-то бала полезна с т.з. написания вменяемого кода.

Поднимите ему веки.

А нет, закройте ему рот.

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

Поднимите ему веки.

Ну дак вперёд - удиви меня. Каждый кукарекает, но никто так ничего конкретного не привёл.

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

Я про тебя, либо так и будешь дальше бояться мне что-то конкретное сказать? Не бойся - я сейчас лечусь и пытаюсь с вами подружиться. Поэтому я серьёзно - можншь - ответь. Мне правда интересно.

Ты реально думаешь, что я не пытался искать плюсы крестов или юзать их? Я с них и перешел на си.

Я действительно не понимаю и не вижу плюсов крестов. Ваять либы для нулей - да, быстро ваять говнокод - да. Удобные либы, а от сишного дерьма волоса на жопе встоют дыбом? да. Но для меня это не особо интересно.

Яж не зря там писал - именно для с т.з. написания куллкода. Т.е. что они дают, что позволяет мне писать лучше?

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

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

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

variadic templates

Было бы всё это не настолько ущербным. Пацаны случайно открыли метапрограммирование на шаблонах и понеслась, примерно как в сишке с препроцессором. Зачем страдать?

не самом деле, даже эти пресловутые «умные» указатели не сжирают ресурс особо.

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

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

Это единственное их применение.

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

И скорость конпеляции не напрягает?

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

Т.е. ты признаёшь факт своего балабольства? Хорошо. Я дам тебе шанс.

Ты выкатываешь конкретную задачу для реализации которой ты считаешь, что нужны шаблоны. Сливы на генерик-интерфейсы будут считать за обсёр. Далее уже требуешь от меня код без шаблонов. Я тебе могу популярно объяснить в чём заключается твоя проблема, если ты будешь согласен внятно слушать и пытаться что-то понимать.

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

Потом ты показываешь, что ты «осилил» написать функцию, чтобы инстанцировать сразу по два. Ты сделал банальную функцию, а шаблон там только потому, что ты впихнул туда изначально шаблоны. Ты благополучно решил проблему созданную форфан на шаблонах при помощи шаблонов - типичная история.

[core=c]return (flag = mchain_tracing_enabled_base) ? f(a, b, c, shit_tracer) : f(a, b, c);//только засунул это в функцию

Хочешь, чтобы я тебя писать код - отвязывай свой пример от свой фигни и выкатывай. Я не обязан разбираться в твоём куллизваянии.

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

#include <type_traits>
namespace {
  using namespace so_5::mchain_props;
  using namespace so_5::mchain_props::details;
  using namespace so_5::impl::msg_tracing_helpers;
  template<bool on, typename T> struct shit {typedef mchain_template<T, typename std::conditional<on, mchain_tracing_enabled_base, mchain_tracing_disabled_base>::type> value;};
  using unlimited_trace = shit<true, unlimited_demand_queue>::value;
  using unlimited = shit<false, unlimited_demand_queue>::value;
  using limited_dynamic_trace = shit<true, limited_dynamic_demand_queue>::value;
  using limited_dynamic = shit<false, limited_dynamic_demand_queue>::value;
  using limited_preallocated_trace = shit<true, limited_preallocated_demand_queue>::value;
  using limited_preallocated = shit<false, limited_preallocated_demand_queue>::value;
};

mchain_t mbox_core_t::create_mchain(environment_t & env, const mchain_params_t & params) {
  auto trace = (m_tracer && !params.msg_tracing_disabled());
  auto id = ++m_mbox_id_counter;

  if(params.capacity().unlimited())
    return (trace) ?  mchain_t {new unlimited_trace {env, id, params, *m_tracer}} : mchain_t {new unlimited {env, id, params}};

  if(params.capacity().memory_usage() == memory_usage_t::dynamic)
    return (trace) ?  mchain_t {new limited_dynamic_trace {env, id, params, *m_tracer}} : mchain_t {new limited_dynamic {env, id, params}};
  
  return (trace) ?  mchain_t {new limited_preallocated_trace {env, id, params, *m_tracer}} : mchain_t {new limited_preallocated {env, id, params}};
}

Ты понял про какие 6функций и какую табличку с 2-мя аргументация говорил?

Логика твоя мне просто не понятно. В чём смысл разных *_demand_queue - мне просто не ведомо. В одном какая-то пародия на на кольцевой буфер, а два других ничем не отличаются, только каким-то ограничением, которое выражается в одном сравнении - этономия в коде с ipc ноль целых хрен десятых. Это хрен пойми зачем пробрасывается в рантайм в хоткод.

Я не вижу нужности шаблонов. Ты же мне сможешь объяснить - зачем они нужны?

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

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

Задача была написать без шаблонов. Где соответствующий код?

В чём смысл разных *_demand_queue - мне просто не ведомо.

Вам не ведомо, что делает код, который вы лихо переписываете. Это диагноз.

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

кресты - это пихание рантама везде форфан не зависимо от тебя

Поясни. В некоторых своих проектах я выключал и исключения и RTTI. О каком рантайме речь?

Конкретно про смарты. unique_ptr фактически не несет оверхеда. Deleter ты можешь определить свой и не дергать delete каждый раз. Распределяй память как тебе надо. shared_ptr несет оверхед, но точно такой же, как если бы ты сделал RC сам. Не нужен RC? Так не юзай и shared_ptr. Deleter в нем ты так же можешь указать свой.

Не говоря уже о самой бесполезности шаблонов.

Ну это неправда. Часто полезен. Избавляет от копипасты. Позволяет легче и проще повторно использовать написанный и отлаженный код.

то ты вынужден писать на кастрированном си

В чем его кастрированность?

Я не нашел в крестах ни одной фичи, которая бы хоть как-то бала полезна с т.з. написания вменяемого кода... Может ты мне её назовёшь?

Ну смотри.

Перегрузка функций часто полезна, чтобы не загромождать код кучей имен функций на ровном месте. Когда не полезна - она никак не мешает.

Неймспейсы помогают избегать конфликтов имен на ровном месте. Не нужны - не используй.

Классы и ООП в C++ стиле - не фонтан в плане теории ООП, но зато и оверхеда нет. Полиморфные вызовы аналогичны вызовам по указателям на функции. В некоторых проектах очень удобно декомпозировать систему именно в духе ООП. Не нужно ООП - не используй.

Исключения. Спорная штука. Но в некоторых проектах вполне приемлемая. Если не используешь, то ничего не платишь(ключами компиляторов вполне можно вообще выключить).

Шаблоны описывал выше. Если с ума не сходить, то удобная вещь. Опять же использовать никто не заставляет.

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

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

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

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

И ещё я должен вести себя нормально с этим мусором, удачи.

Задача была написать без шаблонов. Где соответствующий код?

Обосанно. Там нет шаблонв, убогий - он там для красоты. Хотя ладно - раз уже начал макать тебя в дерьмо - мокну в дерьмо ещё раз.

namespace {
  using namespace so_5::mchain_props;
  using namespace so_5::mchain_props::details;
  using namespace so_5::impl::msg_tracing_helpers;
  using unlimited_trace = mchain_template<unlimited_demand_queue, mchain_tracing_enabled_base>;
  using unlimited = mchain_template<unlimited_demand_queue, mchain_tracing_disabled_base>;
  using limited_dynamic_trace = mchain_template<limited_dynamic_demand_queue, mchain_tracing_enabled_base>;
  using limited_dynamic = mchain_template<limited_dynamic_demand_queue, mchain_tracing_disabled_base>;
  using limited_preallocated_trace = mchain_template<limited_preallocated_demand_queue, mchain_tracing_enabled_base>;
  using limited_preallocated = mchain_template<limited_preallocated_demand_queue, mchain_tracing_disabled_base>;
};

mchain_t mbox_core_t::create_mchain(environment_t & env, const mchain_params_t & params) {
  auto trace = (m_tracer && !params.msg_tracing_disabled());
  auto id = ++m_mbox_id_counter;

  if(params.capacity().unlimited())
    return (trace) ?  mchain_t {new unlimited_trace {env, id, params, *m_tracer}} : mchain_t {new unlimited {env, id, params}};

  if(params.capacity().memory_usage() == memory_usage_t::dynamic)
    return (trace) ?  mchain_t {new limited_dynamic_trace {env, id, params, *m_tracer}} : mchain_t {new limited_dynamic {env, id, params}};

  return (trace) ?  mchain_t {new limited_preallocated_trace {env, id, params, *m_tracer}} : mchain_t {new limited_preallocated {env, id, params}};
}

Без шаблонов. Внизапно.

Вам не ведомо, что делает код, который вы лихо переписываете. Это диагноз.

Естественно ты не можешь мне ответить, ибо некомпетентная балаболка. Ну ответь мне, пж. Зачем там 3недокласа и зачем они нужны?

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

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

Для того, чтобы определить факт твоего обсёра по-умолчанию.

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

Поясни. В некоторых своих проектах я выключал и исключения и RTTI. О каком рантайме речь?

Ну запили мне норм статик в функциях. Самим фактом нужности их отключения ты соглаашешься со мною.

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

Конкретно про смарты. unique_ptr фактически не несет оверхеда.

Ещё раз - распределению памяти в стили крестов/сишки - для школьников. Это не нужно. Ты не сможешь мне придумать ни одно юзкейса, где это было бы нужно. Везде проще срать либо в стек, либо реюзать, либо это большие куски и руками с ними проще.

Ты можешь попробовать - я тебе покажу что имею ввиду.

Deleter ты можешь определить свой и не дергать delete каждый раз.

А ещё надо определить свой аллокатор и вообще переписать весь рантайм, чтобы это приемлемо работало. Зачем?

Ну это неправда. Часто полезен. Избавляет от копипасты.

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

Позволяет легче и проще повторно использовать написанный и отлаженный код.

Это не относится к делу - мне не интересно какие ухишрения ты используешь, чтобы поменьше писать.

Да и проще это как? Приведи примеры. Я таких не знаю.

В чем его кастрированность?

Отсутствие void * и анально рабство у идиотских кастов и прочей херне.

Перегрузка функций часто полезна, чтобы не загромождать код кучей имен функций на ровном месте. Когда не полезна - она никак не мешает.

Она, а потом вызови свою функциию не из крестов.

Чем f(int), f(char) отличается от f_int(int), f_char(char)? а потом сделай на неё тайпоф.

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

Классы и ООП в C++ стиле - не фонтан в плане теории ООП, но зато и оверхеда нет. Полиморфные вызовы аналогичны вызовам по указателям на функции. В некоторых проектах очень удобно декомпозировать систему именно в духе ООП. Не нужно ООП - не используй.

Ты перепутал - классы и поды, а поды не имеют только методы и всё. Никакого ООП в них нет.

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

Исключения. Спорная штука. Но в некоторых проектах вполне приемлемая. Если не используешь, то ничего не платишь(ключами компиляторов вполне можно вообще выключить).

Ога - только две проблемы - тонна говна в бинаре и уходящий в астрал throw хрен пойми как и хрен пойми насколько.

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

Шаблоны описывал выше. Если с ума не сходить, то удобная вещь. Опять же использовать никто не заставляет.

А зачем? Покажи мне зачем их надо использовать. Я уже у всех спрашивал - никто так и не сказал. Кроме интерфейсов и «шаблоны ради шаблонов» - я применения не видел.

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

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

Она компенсирует не недостатки типизации, а крестов. tonsofshit::tonsofshit<tonsofshit::tonsofshit<tonsofshit::tonsofshit>, tonsofshit::tonsofshit<tonsofshit::tonsofshit>, tonsofshit> что-то типа такого.

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

Естественно, ибо редко можно встретить проект, который пишет код таргетспецифик осмысленно и на результат. Таких почти нет.

А когда надо ваять говно и везде кукарекать, что «у меня быстро - я юзаю шаблоны», «у меня не падает - у меня топкресты, а в сишке течёт» и прочее. Ну дак с этим никто не спорит, что ваять проще и удобнее, только это всё в ущерб результату и своему тонусу.

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

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

Опять же - повторю в сотый раз. Я не спорю с тем, что на крестах ваять проще, удобнее и быстрее. Я спорю в тем, что фичи крестов как-то положительно влияют на результат, а даже влияют отрицательно.

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

Там нет шаблонв

Нет не только мозгов, но и глаз:

mchain_template<unlimited_demand_queue, mchain_tracing_enabled_base>
Это, блин, что такое?

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

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

namespace {
template< typename Q, typename... A > mchain make_mchain( so_5::msg_tracing::tracer_t * tracer, A &&... args )
{
      using namespace so_5::mchain_props;
      using namespace so_5::rt::impl::msg_tracing_helpers;
      using D = mchain_tracing_disabled_base;
      using E = mchain_tracing_enabled_base;

      if( tracer )
         return mchain{ new mchain_template< Q, E >{ std::forward<A>(args)..., *tracer } };
      else
         return mchain{ new mchain_template< Q, D >{ std::forward<A>(args)... } };
}

} /* namespace anonymous */

mchain mbox_core_t::create_mchain( environment_t & env, const mchain_params & params )
{
   using namespace so_5::mchain_props;
   using namespace so_5::mchain_props::details;

   auto id = ++m_mbox_id_counter;

   if( params.capacity().unlimited() )
      return make_mchain< unlimited_demand_queue >( m_tracer, env, id, params.capacity() );
   else if( storage_memory::dynamic == params.capacity().memory() )
      return make_mchain< limited_dynamic_demand_queue >( m_tracer, env, id, params.capacity() );
   else
      return make_mchain< limited_preallocated_demand_queue >( m_tracer, env, id, params.capacity() );
} 

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

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

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

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

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

Если ты забыл выкинуть объект из какого-то списка, это утечка?

С точки зрения GC - это не утечка.

GC вообще не оперирует такими терминами как утечка.

И в языках с GC такая ситуация называется непреднамеренная ссылка на объект (unintentional object retention) и считается утечкой.

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

define «утечка»

велкам

a memory leak in Java is a situation where some objects are not used by the application any more, but GC fails to recognize them as unused

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

a memory leak in Java is a situation where some objects are not used by the application any more, but GC fails to recognize them as unused

Here I would like to stress one very important point: the notion of “object is not used by application any more” is totally, absolutely, 100% application specific!

Давай ближе к делу - кроме придирок к словам что-нибудь есть?

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

С точки зрения GC - это не утечка.

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

shty ★★★★★
()
Последнее исправление: shty (всего исправлений: 2)
Ответ на: комментарий от tailgunner

the notion of “object is not used by application any more” is totally, absolutely, 100% application specific

конечно, но в каждом конкретном случае определить это довольно просто

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

С точки зрения GC - это не утечка.

в общем случае так говорить некорректно

Речь шла только о мягких ссылках и их использовании для предотвращения утечек.

А почему некорректно в общем случае? Как раз в общем случае сборка мусора не предотвращает утечек - Boehm GC даже упоминает об этом в FAQ.

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

Это, блин, что такое?

Идиота кусок - это изначально твоё условие, даун. Ты совсем что-ли отбитый?

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

А ну да, прости даун:


      if( tracer )
         return mchain{ new mchain_template< Q, E >{ std::forward<A>(args)..., *tracer } };
      else
         return mchain{ new mchain_template< Q, D >{ std::forward<A>(args)... } };

Тут у тебя не 2вызова new.

В целом слив засчитан. Уже пошли «код не такой, строчки не такие» и прочее, ну типичная картина от ламерка. «шаблоны тут есть» и прочее.

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

Какой нахрен ветвлений, какой нахрен ручной аллокации - что ты несёшь, свинья. Строк у меня меньше, либо столько же.

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

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

Ты так и не осилил даже высрать назначение своего дерьма.

В целом типичная картина. Обосанная ламерюга, решила меня напугать шаблонами - как делается постоянно в тредах про кресты, но оказалось, что напугать царя шаблонами не получилось. Теперь происходит типичное сливание, вернее оно происходило сразу.

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

Не работают - они работают за счёт рантайма.

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

Идиота кусок - это изначально твоё условие

Именно. У меня был простой, но объемный код с использованием шаблонов. С помощью шаблонов же он стал еще проще и намного короче.

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

Тут у тебя не 2вызова new.

У меня 2, у вас получилось 6. Царская щедрость.

Уже пошли «код не такой, строчки не такие» и прочее, ну типичная картина от ламерка. «шаблоны тут есть» и прочее.

Пошел объективный анализ предоставленного вами говнокода, написанного в стиле copy-and-paste. Отсюда и все вышеуказанные проблемы вашего кода, главная из которых — несопровождабельность.

Ты так и не осилил даже высрать назначение своего дерьма.

Там все тривиально. Это инстанцирование шаблона, реализующий канал/буфер для передачи сообщений. Канал может быть неограниченной емкости или же ограниченной, если ограниченной, то память для него может быть либо приаллоцированна сразу, либо же может динамически выделяться/освобождаться в процессе использования канала. Дополнительным свойством канала, ортогональным к емкости, является трассировка операций над каналом.

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

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

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

В 50%+ крестовик юзает new не для того, что он ему нужен, а чтобы вернуть созданный объект из функции, созданный внутри функции. Даже в инлайн функции.

Вменяемый метафункции, а не та параша открытая из шаблонов и структур. Метафункция это не просто генеринье форфан какого-то дерьма, как это делает помойка крестовая, а реальное и осознанная компилтайм-логика.

template<typename a, typename b>//какой к нам пришел а, а какой б? Неведомо. Мы будем просто как дауны их рандомно тыкать - пока один незатыкается. Это просто убожество.

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

Это убогие и жалкий кастыль, абсолютно бесполезное дерьмо - любой вменяемый человек напишет кодоген, Чем заюзает это дерьмо. При это как бы ты жопу не рвал - запилить нормальное что-то на нём просто нереально.

А ну и да - конпеляция по 10лет в подарок. Удачной отладки. Удачи перевести любой проект на хеадер-онли с жалкими попытками купить 200гигов рамы.

В конечном итоге куда не глянь - везде дерьмо. А чего мне реально не хватает в си - этого нет нигде - управляемая конпеляция и кодогинерация. 90% того, чего мне хватает на уровне языка - кастыляется на крестах, но с неприемлемым качеством.

Хочу нормальный printf() - где его взять? Вроде кресты могу - нет, не могут. И как со всем. Вроде могут, а на самом деле нет, ибо везде убогий рантайм.

Пойду чтоли попилю printf() на крестах. Авось смогу.

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

Именно. У меня был простой, но объемный код с использованием шаблонов. С помощью шаблонов же он стал еще проще и намного короче.

Про проще не было - было про короче.

Ты мне объясни - ты реально не понимаешь что-то в этом жизнь, либо ты притворяешься?

У меня был простой, но объемный код с использованием шаблонов.

Это проблема твоя и шаблонов. Ты это понимаешь? Когда ты это говоришь - ты множишь саму постановку вопрос на ноль.

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

Где. Давай мы договоримся. Я тебя никогда не обманываю и если я сказал, что такого я не говорил, либо я говорю, что это так, а не иначе - это действительно так.

Я тебя могу сейчас послать в ту темку за «предоставить мне доказательства» и ты ничего мне не принесёшь, зачем ты это пишешь? Ты можешь попробовать и вести себя приемлемо, либо просто вести себя приемлемо.

Если я где-то ошибаюсь я поймаю себя быстрее и в отличии от балаболов я на публику не играю и мне абсолютно насрать - я сам это скажу.

У меня 2, у вас получилось 6. Царская щедрость.

И, что из этого следует? У тебя он не один, а остальное не важно. Я могу там макрос захреначить и будет тебе так же два. Но я тебя пожалел.

mchain_t mbox_core_t::create_mchain(environment_t & env, const mchain_params_t & params) {
  using namespace so_5::mchain_props;
  using namespace so_5::mchain_props::details;
  using namespace so_5::impl::msg_tracing_helpers;
  #define make_mchain(arg0, arg1, args...) mchain_t { new mchain_template<arg0 ## _demand_queue, mchain_tracing_ ## arg1 ## _base> { args }}
  
  auto trace = (m_tracer && !params.msg_tracing_disabled());
  auto id = ++m_mbox_id_counter;

  if(params.capacity().unlimited())
    return (trace) ? make_mchain(unlimited, enabled, env, id, params, *m_tracer) : make_mchain(unlimited, disabled, env, id, params);

  if(params.capacity().memory_usage() == memory_usage_t::dynamic)
    return (trace) ? make_mchain(limited_dynamic, enabled, env, id, params, *m_tracer) : make_mchain(limited_dynamic, disabled, env, id, params);

  return (trace) ? make_mchain(limited_preallocated, enabled, env, id, params, *m_tracer) : make_mchain(limited_preallocated, disabled, env, id, params);
}

Могу и не жалеть.

Пошел объективный

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

У тебя там ровно три копипасты. Столько же, сколько и у тебя. А так да «несопровождаем» - любая отмазка балаболов, когда они обделывается. При этом никаких конкретных критериев не предоставляется.

Там все тривиально.

Я не спрашиваю для чего нужны твои каналы - я спрашиваю чем отличается три разных вида этих каналов. Ничего сложнее хелворда ты всё равно не напишешь - зачем ты про рассказываешь про тривиально?

2 вида отличаются одним сравнение - ты это должен пояснить.

Третий какой-то убогий кастыль.

Зачем ты в первые два пихнул стльную очередь, если ты её уже реализовал в третьем?

В конечном итоге все три твоих класса сводятся к одному на векторе, с преаллокаций на 5-10% по умолчанию, либо на полную и длинной 100500 по умолчанию.

Дополнительным свойством канала, ортогональным к емкости, является трассировка операций над каналом.

Ну и - инстанцируй 2 версии с трассировкой и без. В целом тебе достаточно будет трассировки на ифах - в твоём коде это будет стоить ноль.

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

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

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

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

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

И опять же, покажу банальный фокус - как смшеать блабола с дерьмом. Достаточно спросить «в чём конкретно я обделался» и всё.

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

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

А как нужно?

Вменяемый метафункции

над AST?

Хочу нормальный printf() - где его взять?

А в rust нормальный?

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

И скорость конпеляции не напрягает?

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

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

А как нужно?

функция инициализирует в области видимости свой возрат в теле. Т.е.

inline f() {vector v; bla-bla; return v;}
alias v = f();//v является тем вектором, который создаётся в теле функции. Сама функция является v.
//то же самое и со входом.


>>над AST?
ast для школьников.

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


>>А в rust нормальный?
Руст писали аутисты для аутистов - я не верю, что там может быть что-то вменяемое.
anonymous
()
Ответ на: комментарий от Iron_Bug

нет. я вообще не понимаю тех, кто плачется о скорости компиляции.

А, т.е. собрать хелворд и глянуть -S это не скорость конпеляции? А как же оптимальный код?

Запихнёшь в структуру чуть больше полей - привет вместо f(strutct {int, int, int}) -> f(int, int, int) будет передача через стек парашу.


f() {for(0...20)} - копилтайм, а f() {for(0...50)} - уже нет.
f_table[] = {f0, f1, f2};
//бам-бам чуть ошибся и гцц не смог f_table[1]() свести к f1().
//бам-бам чуть больше вложил функий и гцц уже их не свернул;

fptr_t fptr = f();

f(fptr_t fptr) {f0(fptr) {fptr();/*тут уже не смоглось в f()*/}}

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

//А уж как заставить: { } { } { } //эту калеку анрол нормально зашедулить - это просто боли в заднице каждый раз

я могу даже с profile guided повозиться, и с подсказками для компилятора.

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

пожертвую хоть неделей и пусть себе билд-сервер пашет, лишь бы на выходе был оптимальный код.

Оптимальный код? Из под убого конпелятора - смешно.

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

Это делает из кода говно. Если это не тонна cold-лапши.

Я уже где-то показывал. Сравнение Rust и C++ на примере трассировщика путей (комментарий) - вот тут.

Без этого pgo гонять не имеет смысла - он там ничего не соптимизирует.

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

В крестах для этого есть объекты-функции и std::function.

В крестах есть все, но это все через анус.

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

boost::format в помощь. Даже при условии, что C++ — говно, там довольно таки интересно всё сделано.

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