Если бы не PVS-Studio, в коде так и осталась бы эта ошибка, приводящая к утечке памяти.
Все зависит от вашего определения утечки памяти. Если ваш синтетический тест повторяет структуру реального кода, то я бы не согласился с тем что это утечка, т.к. это уже конец мэйна - программа завершена. Опять же можно спорить об определениях и эта "утечка" может мешать анализу настоящих утечек с помощью дебажного алакатора, но по факту конкретно в этом случае это не утечка. Если уж совсем дотошно, то с точки зрения самого с++ это вообще не утечка при любом раскладе, т.к. утечкой язык называет аллоцированную память на которую нет ни единого валидного указателя, а тут он есть.
AMD, Intel и ARM от этого мне сразу диктует, с кем мне спать, как мне обороняться, делать ли мне аборты, идти ли мне воевать с соседом, и так далее?
А разве нет? Никогда такого не было, что бы большая компания манипулировала рынком используя свое положение, или никогда не заставляла соглашаться на кабальные условия предоставления услуг, или ни разу в истории человеку не отказывали в продаже товара потому, что он не рассово верной национальности, ну вы поняли о чем я. Что собственно помешает большим иерархиям навязывать свои кабальные условия? Свободный рынок, альтернативные компании? Вот я возьму под контроль единственный источник воды в регионе и стану требовать с вас предоставления сексуальных услуг за возможность не умереть с жажды, свободный рынок договор и все дела, не нравится ну так вон в Антарктике бесплатно напьешься. Не можешь добраться туда так обезвожен? Ахах сам себе злобный Буратино, нет серьезно что меня да и вас остановит, ну ладно у вас там в голове какие то моральные принципы, ну я то обезьяна лишённая этих когнитивных искажений, я то точно буду пытаться высушить вас до суха, и я уверен на 146% я смогу найти себе помощников, а вы не сможете это тоже гарантировано. Мне нет смысла изучать теоретические бредни, они все до единого ложные, что бы меня переубедить достаточно ровно 1 контрпримера успешного человеческого общества живущего без государства. Хотя бы исторического, но это уже не гарантия что я поменяю свое мнение. Если карта противоречит реальности то ну ее нахер такую реальность? Это похоже ваше жизненное кредо.
Я ж сказал что в сортах свободы не разбираюсь и не планирую это исправлять, меня обстрактные/идеальные идеи/утопии не увлекают, поэтому ничего посоветовать не могу. Но могу возразить вашему асампшену что люди говоря о проблемах свободы подразумевают ценность таковой. Есть и такие которым важно конкретное, а не обстрактное, ну например что бы налоги шли туда куда провозглашается они должны идти и т.д. Вы тут заливаете про какой то стартап свободы, где внезапно по какой то магии люди перестанут нарушать контракты. Вот даже ваш пример ниже про совместное решение реальных задач, все равно потребует какой то управляющей структуры иерархии, что есть суть государства, и с чего эта иерархия внезапно будет работать лучше чем текущая, а да потому что она маленькая и расти ей не выгодно - это ваще бред какой то. Иерархия возникает вследствие делегации, которая следствие специализации. Вы ж не умеете и вероятно не хотите М, а я не умею и не хочу учиться Н, вот я делегирую вам Н, а вы мне М, а потом наступает момент скэйлинга и мне нужна помощь с Н а вам с М, и мы организуем иерархии, все привет государство. Это объективная потребность для решения реальных проблем. Все известные нам формы свободных обществ застряли в доцивилизационном уровне, я там жить не хочу, и многие другие тоже. Люди жалуются и хотят одной простой вещи - соблюдения контрактов, остальное их устраивает, это по-вашему свободно заключеннный контракт на делегацию принятия решений и ответственности, все как вы любите, как я и сказал проблема в том что другая сторона систематически обманывает и что с этим делать не понятно. Ваш вариант заведомо мертво рождённый т.к. даже не признает существование проблемы не соблюдения контракта, а просто призывает заменить Х на У и получать профит.
То что бьют реже и похлёбка вкуснее уже само по себе ценность, а почему вы так про путь к свободе говорите, что у нас у всех должно возникнуть ощущение что это ценность? Не, серьезно кому эта свобода впилась? А на вашем языке, у вас пресуперпозиция о ценности свободы ничем не обоснованна. Я в сортах свободы не особо разбираюсь, но слышал что в Африке ее завались, ну т.е. есть реальные примеры того где люди стараются расправиться с государством изо всех сил, но чёт статей о переезде на ПМЖ в Сомали я как то не вижу.
И самое главное вы сами как то не стремитесь переехать туда где этой самой свободы побольше, ну например в какое нибудь экзотическое не признанное недогосударство на бывшей нефтяной платформе.
Мне кажется, те кто вас не знают, этими минусами вменяют вам скрытый призыв не раскачивать лодку, сидеть на попе ровно и не отсвечивать, короче совсем не то о чем вы пишите. Ну по простому, ваш саркастический комментарий остался не понятен массам.
Эта часть вашего языка классная, подумайте ещё об одном операторе - пайп. Пример:
fn getOptInt(x: int) -> ?int { x != 0 ? 42 / x }
x = getOptInt(42) ?| + 3; //x == 4
x = x ?| * 5 + 1 | getOptInt; //x == 2
x ?| == 2 : panic("фигня какая то")
Ну помимо сахара собственно от пайпа это ещё решает проблему _, оно становится не нужно. А если нужно (пере)именование, то можно так
x = x ? { |x; x + 5 }
Это если у вас нет аллергии на хайдинг, а если есть то вместо х придется что то другое. Поясню мысль здесь |х присваивает имя з рвалью от ?, для этого конечно блочный оператор должен иметь входной параметр, который по умолчанию юнит/войд. Много кто жалуется что оператор присваивания перевернут, вместо присваивания правой части левой он должен присваивать левую правой тогда выражения бес костылей можно делать, но это конечно радикально.
Не очень понимаю. Вот допустим вам нужна какая то инфа, но она за пэйволом и цена для вас неподьемна, но инфа нужна. Ну или если пример кажется вам не удачным то вместо денег просят сделать что то расходящееся с вашими этическими нормами, а вместо инфы ну например вода в пустыне - жизненно важный ресурс. Так вот по вашему определению отказаться вы не можете, но и цена не подходит, значит это навязывание. А что если для другого человека то же предложение не вызывает проблем другому все норм на тех же условиях. Утрируем, всем кроме вас норм, только у вас проблема. Это тоже навязывание? Тогда как внешний наблюдатель сможет понять навязывает вам кто то что либо или нет? Ну т. е. навязывание это такая субъективная штука, что вы назовёте навязыванием, то и будет этим, но только для вас.
У меня ещё более радикальный вопрос, а в чем вообще проблема то, даже если оптимальное количество людей 0? Ну вымрут все и чё? Если никого нет то и расстраиваться некому. Хотят быть родителями пусть будут, не хотят не будут. @0xd34df00dтут хорошо доносит, только зачем то ограничивает себя какой то этикой. Может я один такой, но все же я реально не понимаю в чем проблема то? Ну вот серьезно, завтра мы узнаем, что все женщины не могут рожать, осталось грубо говоря 100 лет до исчезновения всех людей и чё? Я не очень антрополог кто там был до кроманьонцевх? Их нет. Ну типа мы их потомки, хорошо я сразу зайду с козырей вы понимаете, что вы суть непрерывного существования жизни в сотни миллионов лет начиная от прокариотов. И вот тех самых видов протоклеток, от которых вы произошли, нет и в помине эти самые сотни лет и чё? Зайдём ещё дальше, завтра мы узнаем что вся жизнь на земле стала стерильной, пройдет всего то пару лет чтобы планета стала безжизненной ну т.е. у вас будет время порефлексировать на эту тему и опять же я лично проблемы не вижу. Мой самый любимый фильм Меланхолия прекрасно описывает один из вариантов событий. Жизнь бессмысленна не только на индивидуальном уровне, а вообще на любом уровне. Оставьте вы(не вы лично, а метафорически) уже всех в покое пусть люди живут как хотят, а не как им навешивают всякие религиозные мракобесы. Последние 1000 лет людям засерали мозги первородным грехом (у меня нет приличных слов для описания как меня бомбит от этого), вроде разобрались с этим, но сегодня другие люди засирают мозги грехом бездетности, а это ни что иное как религиозное мракобесие только поданное под рационализаторским соусом. Хватит, я никому ниче не должен, моя родина планета земля, поэтому я пригождаюсь там где живу, а не там где меня заставляют, нет у меня никаких первородных грехов (да и вообще я святой безгрешник) поэтому спасение души мне не нужно (да и вообще я философский зомби - нечего спасать) живу как хочу (ну стараюсь по мере сил, но мне все время мешают) и вам всем того же желаю.
Скажите пожалуйста, а что значит по вашему навязывание? Добровольные отношения вроде как интуитивно понятны, это обмен ты мне я тебе курс обмена обсуждается. А что такое навязывание? Какова модель это явления?
Я из другого лагеря и мне авто не хватает. Хочу авто не просто везде где сейчас можно, а вообще везде - типы параметров функций (да я знаю можно получить что хочу через лямбды, но без дедусит зис с++23 это не то, мне рекурсия часто нужна). Хочу авто в декларации мемберов класса, а тип пусть из инициализатора выводится, соглашусь с автором в одном П-последовательность с++ это нечто ни кем не виденное, статики в классах значит можно с авто, а мемберы низя, почему?
Типы они для компиляторов и они очень нужны, но людей от них надо держать подальше. Для людей есть имена/идентификаторы, вот они должны быть такими что бы вам пофигу было на тип. Конечно, всегда есть исключения вот для них и оставить явные типы.
Автор не убедил, все проблемы поднятые в статье закрываются юнит тестами, и не важно авто у вас там или явные типы. Пишу авто везде где работает уже лет 10, полет отличный.
Но признаюсь честно, даже среди тех кто пишут на плюсах годами каждый день очень мало кто знает и понимает зачем это.
А нужно это именно для выражение композиции через владение значением по дефолту, но если нужно, то юник поинтер тоже можно использовать.
Ещё раз в плюсах композиция это по дефолту владение значением, есть причины когда это не желательно, тогда композиция выражается через владение юник поинтером.
Выши замечания, что владение по значению и/или юник поинтером не совместимы с шаред/вик поинтером - не состоятельны. Смотрите документацию, и сразу скажу я так делал и не раз. Единственное условие для этой техники это алокация рут объекта дерева объектов в хипе и владение этим рутом через шаред поинтер.
В плюсах все связи (агрегация/ассоциация) между объектами внутри одного дерева это просто сырые указатели. Потребность в вик поинтерах возникает только для ассоциации с объектом из другого дерева объектов.
Агрегация с независимым объектом (иммутабл в вашем случае) в плюсах выражается не через шаред поинтер(хотя конечно можно, но не нужно это как из пушки по воробьям), а через интрузив поинтер его в стандарте нет, но есть много где в других либах. Если агрегаты и объекты которые их агрегируют живут в одном потоке то счётчик может быть не атомарным, в общем случае нужен атомарный (но х86 разницы нет). В случае многопотока, имутабельность агрегатов позволяет обойтись только релаксед операциями на счётчике (заметьте что релакседы все равно атомарны по записи в память), а не более дорогой парой аквайр/релиз которая нужна только если объект мутабельный (чтобы как раз эти мутации гарантировано подтянулись в деструкторе).
Если у вас вызывает затруднения понимание как это работает, я могу написать вам кратенький пример.
Согласен, проверка на нул здесь скорее всего по другим причинам, у вас пример перегружен, вам надо иметь отдельные виртуальные методы или помеченные ноинлайн или ещё как то сказать компилятору не инлайнить и в этих методах нужно по отдельности / в изоляции смотреть на каст, вызов, конструктор, и вы ещё забыли про деструктор. В деструкторах происходит обратное колдунство, после очередного деструктора соответствующий указатель на втэйбл зануляется.
они гораздо сложнее, чем "смещение на компайл тайм константу"
Ну как же, вот же асемблер, да проверка на нул, потом в ах грузится виртуальная таблица ИБ, для ИА тоже самое только константа будет 0, для какого нибудь ИС будет 16 и т.д. В сх грузится зис также смещенный на ту же константу. Проверку на нул не избежать и она у вас и так есть в виде оптионала. Мало того у вас в примере каст + виртуальный вызов, сделайте просто каст. При касте сместиться только зис и все (я не проверял, но ванную даже проверки на нул не будет).
Если храните базовые указатели (имеется в виду указатель на сам объект?)
Нет, имеется в виду, что если вам нужна виртуальность то никто не хранит указатели на конкретные типы, вместо этого хранятся указатели на интерфейсы/базовые классы. Это значит, что в вашем примере обдж не авто поинтер, а ИБ*.
Если хотите узнать сколько стоит каст, то тестить надо вот это, а не то что вы тестить
auto* obj = new Impl();
IB* base = obj;
Вот вторая строка и есть статик каст, и в конвенциальном коде который использует виртуальность этот каст будет один раз при инициализации указателя, т.к. обдж никому не нужен, а нужен только бэйз.
Невидимых кастов никаких нет при использовании бэйз указателя.
будут по одному vmt_ptr на каждый отдельный реализованный интерфейс
Да.
будет движение this-указателя при кастах
Да, это движение тривиально, смещение на компайл тайм константу + касты редки. Ну т.е. когда вы пишите код который наследует вот таким образом, то вы и объекты храните в контейнерах сразу через базовый указатель, а иначе зачем это все.
двойной размер всех смарт-поинтеров
Это я не понял о чем вы, любой юник поинтер всегда один указатель, любой шаред поинтер зависит от реализации, но все с чем я реально сталкивался всегда 2 указателя(объект + делетер) + счётчик. И это так сделано совсем по другим причинам, это такой дизайн шаред поинтера.
сложная настройка объекта в конструкторе с заполнением всех этих vmt_ptr-полей
Нет, эта часть тривиальна, очередной (базовый) конструктор отработал перезапишится первый ВМТ(и то один раз после конструктора базового не интерфейса) и посестится очередной вмт, опять же по фиксированным смещениям, но соглашусь это для каждого объекта, хотя обычно конструкторы вот в таких случаях совсем не тривиальны и так.
Вообще сравнивать надо яблоки с яблоками, если у вас ограничения то и в других языках нужно смотреть на реализацию с учётом таких же ограничений.
И ещё, вы тут много пишете про бест практисы, но я не очень понимаю как это у вас сочетается с оптимизацией перформанса динамик кастов. Я может отстал от жизни, но всегда считал динамик каст хаком, нарушением инкапсуляции, но готов посмотреть на ваш пример с рантайм "интроспекцией" (ну хак хаком же) где это по вашему уместно. Сразу скажу что в тех же растах у вас просто будет несколько контейнеров (а)рс где один и тот же объект боксится несколько раз по разным крэйтам и никаких динамик кастов не потребуется
Я вам ещё один хороший вопрос задам, а что на счёт сравнения вашей диспетчеризации с С++, но только наложите на с++ код те же ограничения что и у вас в языке - нет виртуального наследования, наследовать можно только одну реализацию и сколько угодно интерфейсов (классов без данных с виртуальными методами). Мне асемблер обычно не интересен и я туда не гляжу, но даётся мне что для компиляторов это первичный сценарий для оптимизаций и ставлю на то что в с++ для такого случая быстрее чем у вас.
Ну почему же, у меня вот специфическая задача, проверить перед загрузкой в память своего приложения, что мой плагин не пропатчен. Я пока вижу это так, генерирую пару пуб/приват ключи, хардкожу пуб ключ в бинарь своего приложения, подписываю приватным ключём свои сборки плагина. В приложении перед загрузкой плагина проверяю подпись с помощью захардкоженного пуб ключа. Зачем мне для этой задачи вся эта пки, какие доп гарантии это мне даст по сравнению с тем что я описал? Само приложение то будет подписано как надо, а вот плагин по простому. Приложение инсталится как положено, а вот плагин дестрибутится на флешках такова природа моего приложения.
Ну давайте в студию норм чувака который на аналогичной позиции чето добился. Не я не оправдываю, просто критерий нормальности уж слишком расплывчатый, есть много людей (и здесь кстати тоже) которые на полном серьёзе так про сталина говорят. Я вот честно признаться на таких позициях мог и покруче дичь творить и все из благих намерений, хорошо что у меня нет власти.
Назад к топику, видится мне если такие высказывания не подподают под уголовку то Маск, я думаю, защищал бы. Говорить/думать/иметь мнение различное с мэйнстримным, но не делать ничего противозаконного и пострадать за это как раз то с чем Маск и обещает помочь.
Ну что сказать, у меня по сочинениям всегда была оценка 5, только это сумма из двух за грамматика и правильная речь. Меньше 10 ошибок в тексте на 500 слов никогда не было, и вы знаете что? Оказывается, в реальной жизни, с этим диагнозом можно жить, жить нормально и не лечится (хотя я пробовал лечится - таблетки не помогают), даже в России и уж тем более там где русский это иностранный язык, но это на самом деле распространяется и на другие языки.
А я вот системный расист, вижу представителя рассы доджи/гопник сразу стараюсь перейти на другую сторону улицы и по быстрее, в контакт с такими не вступаю и вообще всячески опасаюсь. В каждой новой локации обновляю в своей голове характерные признаки людей такой рассы в этой местности и продолжаю их системно ненавидеть. Это я к тому что система распознавания похоже тоже видит что и я, поэтому правильно ее обвиняют в рассизме. /s
Нарушения нарушению рознь, я так регулярно (да и вы тоже без исключений) какое нибудь пожелание правил нарушаю ежедневно. Ну например самое частое, две полосы в частном секторе с юнитами, с обоих сторон почти все запаркованно, т.к. не у всех есть парковка во дворе или не всем хватает или ещё какие причины. По правилам я должен машины объезжать и возвращаться в свою полосу если там есть место, да ещё и как новогодняя ёлка поворотниками мигать при каждом маневре, да ещё и заранее. Так НИКТО не делает, поворотниками не сигналят вообще потому что и так всем буквально очевидны ваши и чужие маневры, в свою полосу уходят только чтобы разъехаться со встречной машиной. Т.е. по факту дорога вмещает 3 полосы, 2 крайних заняты в случайных местах и есть одна центральная общая для обоих направлений, ни одни правила это адекватно не описывают и о ужас люди как-то сами справились без них. Я это к чему, я думаю что вы сильно переоцениваете значение правил это не законы физики, игнорирования которых фатально, а просто набор букв которые пытаются с ориентировать вас в МОДЕЛИРУЕМОЙ реальности.
Все зависит от вашего определения утечки памяти. Если ваш синтетический тест повторяет структуру реального кода, то я бы не согласился с тем что это утечка, т.к. это уже конец мэйна - программа завершена. Опять же можно спорить об определениях и эта "утечка" может мешать анализу настоящих утечек с помощью дебажного алакатора, но по факту конкретно в этом случае это не утечка. Если уж совсем дотошно, то с точки зрения самого с++ это вообще не утечка при любом раскладе, т.к. утечкой язык называет аллоцированную память на которую нет ни единого валидного указателя, а тут он есть.
А разве нет? Никогда такого не было, что бы большая компания манипулировала рынком используя свое положение, или никогда не заставляла соглашаться на кабальные условия предоставления услуг, или ни разу в истории человеку не отказывали в продаже товара потому, что он не рассово верной национальности, ну вы поняли о чем я. Что собственно помешает большим иерархиям навязывать свои кабальные условия? Свободный рынок, альтернативные компании? Вот я возьму под контроль единственный источник воды в регионе и стану требовать с вас предоставления сексуальных услуг за возможность не умереть с жажды, свободный рынок договор и все дела, не нравится ну так вон в Антарктике бесплатно напьешься. Не можешь добраться туда так обезвожен? Ахах сам себе злобный Буратино, нет серьезно что меня да и вас остановит, ну ладно у вас там в голове какие то моральные принципы, ну я то обезьяна лишённая этих когнитивных искажений, я то точно буду пытаться высушить вас до суха, и я уверен на 146% я смогу найти себе помощников, а вы не сможете это тоже гарантировано. Мне нет смысла изучать теоретические бредни, они все до единого ложные, что бы меня переубедить достаточно ровно 1 контрпримера успешного человеческого общества живущего без государства. Хотя бы исторического, но это уже не гарантия что я поменяю свое мнение. Если карта противоречит реальности то ну ее нахер такую реальность? Это похоже ваше жизненное кредо.
Я ж сказал что в сортах свободы не разбираюсь и не планирую это исправлять, меня обстрактные/идеальные идеи/утопии не увлекают, поэтому ничего посоветовать не могу. Но могу возразить вашему асампшену что люди говоря о проблемах свободы подразумевают ценность таковой. Есть и такие которым важно конкретное, а не обстрактное, ну например что бы налоги шли туда куда провозглашается они должны идти и т.д. Вы тут заливаете про какой то стартап свободы, где внезапно по какой то магии люди перестанут нарушать контракты. Вот даже ваш пример ниже про совместное решение реальных задач, все равно потребует какой то управляющей структуры иерархии, что есть суть государства, и с чего эта иерархия внезапно будет работать лучше чем текущая, а да потому что она маленькая и расти ей не выгодно - это ваще бред какой то. Иерархия возникает вследствие делегации, которая следствие специализации. Вы ж не умеете и вероятно не хотите М, а я не умею и не хочу учиться Н, вот я делегирую вам Н, а вы мне М, а потом наступает момент скэйлинга и мне нужна помощь с Н а вам с М, и мы организуем иерархии, все привет государство. Это объективная потребность для решения реальных проблем. Все известные нам формы свободных обществ застряли в доцивилизационном уровне, я там жить не хочу, и многие другие тоже. Люди жалуются и хотят одной простой вещи - соблюдения контрактов, остальное их устраивает, это по-вашему свободно заключеннный контракт на делегацию принятия решений и ответственности, все как вы любите, как я и сказал проблема в том что другая сторона систематически обманывает и что с этим делать не понятно. Ваш вариант заведомо мертво рождённый т.к. даже не признает существование проблемы не соблюдения контракта, а просто призывает заменить Х на У и получать профит.
То что бьют реже и похлёбка вкуснее уже само по себе ценность, а почему вы так про путь к свободе говорите, что у нас у всех должно возникнуть ощущение что это ценность? Не, серьезно кому эта свобода впилась? А на вашем языке, у вас пресуперпозиция о ценности свободы ничем не обоснованна. Я в сортах свободы не особо разбираюсь, но слышал что в Африке ее завались, ну т.е. есть реальные примеры того где люди стараются расправиться с государством изо всех сил, но чёт статей о переезде на ПМЖ в Сомали я как то не вижу.
И самое главное вы сами как то не стремитесь переехать туда где этой самой свободы побольше, ну например в какое нибудь экзотическое не признанное недогосударство на бывшей нефтяной платформе.
Мне кажется, те кто вас не знают, этими минусами вменяют вам скрытый призыв не раскачивать лодку, сидеть на попе ровно и не отсвечивать, короче совсем не то о чем вы пишите. Ну по простому, ваш саркастический комментарий остался не понятен массам.
Эта часть вашего языка классная, подумайте ещё об одном операторе - пайп. Пример:
fn getOptInt(x: int) -> ?int { x != 0 ? 42 / x }
x = getOptInt(42) ?| + 3; //x == 4
x = x ?| * 5 + 1 | getOptInt; //x == 2
x ?| == 2 : panic("фигня какая то")
Ну помимо сахара собственно от пайпа это ещё решает проблему _, оно становится не нужно. А если нужно (пере)именование, то можно так
x = x ? { |x; x + 5 }
Это если у вас нет аллергии на хайдинг, а если есть то вместо х придется что то другое. Поясню мысль здесь |х присваивает имя з рвалью от ?, для этого конечно блочный оператор должен иметь входной параметр, который по умолчанию юнит/войд. Много кто жалуется что оператор присваивания перевернут, вместо присваивания правой части левой он должен присваивать левую правой тогда выражения бес костылей можно делать, но это конечно радикально.
x ? { | = x; x + 5 } = x;
Не очень понимаю. Вот допустим вам нужна какая то инфа, но она за пэйволом и цена для вас неподьемна, но инфа нужна. Ну или если пример кажется вам не удачным то вместо денег просят сделать что то расходящееся с вашими этическими нормами, а вместо инфы ну например вода в пустыне - жизненно важный ресурс. Так вот по вашему определению отказаться вы не можете, но и цена не подходит, значит это навязывание. А что если для другого человека то же предложение не вызывает проблем другому все норм на тех же условиях. Утрируем, всем кроме вас норм, только у вас проблема. Это тоже навязывание? Тогда как внешний наблюдатель сможет понять навязывает вам кто то что либо или нет? Ну т. е. навязывание это такая субъективная штука, что вы назовёте навязыванием, то и будет этим, но только для вас.
У меня ещё более радикальный вопрос, а в чем вообще проблема то, даже если оптимальное количество людей 0? Ну вымрут все и чё? Если никого нет то и расстраиваться некому. Хотят быть родителями пусть будут, не хотят не будут. @0xd34df00dтут хорошо доносит, только зачем то ограничивает себя какой то этикой. Может я один такой, но все же я реально не понимаю в чем проблема то? Ну вот серьезно, завтра мы узнаем, что все женщины не могут рожать, осталось грубо говоря 100 лет до исчезновения всех людей и чё? Я не очень антрополог кто там был до кроманьонцевх? Их нет. Ну типа мы их потомки, хорошо я сразу зайду с козырей вы понимаете, что вы суть непрерывного существования жизни в сотни миллионов лет начиная от прокариотов. И вот тех самых видов протоклеток, от которых вы произошли, нет и в помине эти самые сотни лет и чё? Зайдём ещё дальше, завтра мы узнаем что вся жизнь на земле стала стерильной, пройдет всего то пару лет чтобы планета стала безжизненной ну т.е. у вас будет время порефлексировать на эту тему и опять же я лично проблемы не вижу. Мой самый любимый фильм Меланхолия прекрасно описывает один из вариантов событий. Жизнь бессмысленна не только на индивидуальном уровне, а вообще на любом уровне. Оставьте вы(не вы лично, а метафорически) уже всех в покое пусть люди живут как хотят, а не как им навешивают всякие религиозные мракобесы. Последние 1000 лет людям засерали мозги первородным грехом (у меня нет приличных слов для описания как меня бомбит от этого), вроде разобрались с этим, но сегодня другие люди засирают мозги грехом бездетности, а это ни что иное как религиозное мракобесие только поданное под рационализаторским соусом. Хватит, я никому ниче не должен, моя родина планета земля, поэтому я пригождаюсь там где живу, а не там где меня заставляют, нет у меня никаких первородных грехов (да и вообще я святой безгрешник) поэтому спасение души мне не нужно (да и вообще я философский зомби - нечего спасать) живу как хочу (ну стараюсь по мере сил, но мне все время мешают) и вам всем того же желаю.
Скажите пожалуйста, а что значит по вашему навязывание? Добровольные отношения вроде как интуитивно понятны, это обмен ты мне я тебе курс обмена обсуждается. А что такое навязывание? Какова модель это явления?
Я из другого лагеря и мне авто не хватает. Хочу авто не просто везде где сейчас можно, а вообще везде - типы параметров функций (да я знаю можно получить что хочу через лямбды, но без дедусит зис с++23 это не то, мне рекурсия часто нужна). Хочу авто в декларации мемберов класса, а тип пусть из инициализатора выводится, соглашусь с автором в одном П-последовательность с++ это нечто ни кем не виденное, статики в классах значит можно с авто, а мемберы низя, почему?
Типы они для компиляторов и они очень нужны, но людей от них надо держать подальше. Для людей есть имена/идентификаторы, вот они должны быть такими что бы вам пофигу было на тип. Конечно, всегда есть исключения вот для них и оставить явные типы.
Автор не убедил, все проблемы поднятые в статье закрываются юнит тестами, и не важно авто у вас там или явные типы. Пишу авто везде где работает уже лет 10, полет отличный.
Вы плохо говорите на с++, наверное потому что он не родной для вас.
Шаред поинтеров вы не знаете, одна из причин на уровне дизайна почему в нем 2 указателя перегрузка номер 8 https://en.cppreference.com/w/cpp/memory/shared_ptr/shared_ptr
Но признаюсь честно, даже среди тех кто пишут на плюсах годами каждый день очень мало кто знает и понимает зачем это.
А нужно это именно для выражение композиции через владение значением по дефолту, но если нужно, то юник поинтер тоже можно использовать.
Ещё раз в плюсах композиция это по дефолту владение значением, есть причины когда это не желательно, тогда композиция выражается через владение юник поинтером.
Выши замечания, что владение по значению и/или юник поинтером не совместимы с шаред/вик поинтером - не состоятельны. Смотрите документацию, и сразу скажу я так делал и не раз. Единственное условие для этой техники это алокация рут объекта дерева объектов в хипе и владение этим рутом через шаред поинтер.
В плюсах все связи (агрегация/ассоциация) между объектами внутри одного дерева это просто сырые указатели. Потребность в вик поинтерах возникает только для ассоциации с объектом из другого дерева объектов.
Агрегация с независимым объектом (иммутабл в вашем случае) в плюсах выражается не через шаред поинтер(хотя конечно можно, но не нужно это как из пушки по воробьям), а через интрузив поинтер его в стандарте нет, но есть много где в других либах. Если агрегаты и объекты которые их агрегируют живут в одном потоке то счётчик может быть не атомарным, в общем случае нужен атомарный (но х86 разницы нет). В случае многопотока, имутабельность агрегатов позволяет обойтись только релаксед операциями на счётчике (заметьте что релакседы все равно атомарны по записи в память), а не более дорогой парой аквайр/релиз которая нужна только если объект мутабельный (чтобы как раз эти мутации гарантировано подтянулись в деструкторе).
Если у вас вызывает затруднения понимание как это работает, я могу написать вам кратенький пример.
Согласен, проверка на нул здесь скорее всего по другим причинам, у вас пример перегружен, вам надо иметь отдельные виртуальные методы или помеченные ноинлайн или ещё как то сказать компилятору не инлайнить и в этих методах нужно по отдельности / в изоляции смотреть на каст, вызов, конструктор, и вы ещё забыли про деструктор. В деструкторах происходит обратное колдунство, после очередного деструктора соответствующий указатель на втэйбл зануляется.
Ну как же, вот же асемблер, да проверка на нул, потом в ах грузится виртуальная таблица ИБ, для ИА тоже самое только константа будет 0, для какого нибудь ИС будет 16 и т.д. В сх грузится зис также смещенный на ту же константу. Проверку на нул не избежать и она у вас и так есть в виде оптионала. Мало того у вас в примере каст + виртуальный вызов, сделайте просто каст. При касте сместиться только зис и все (я не проверял, но ванную даже проверки на нул не будет).
Нет, имеется в виду, что если вам нужна виртуальность то никто не хранит указатели на конкретные типы, вместо этого хранятся указатели на интерфейсы/базовые классы. Это значит, что в вашем примере обдж не авто поинтер, а ИБ*.
Если хотите узнать сколько стоит каст, то тестить надо вот это, а не то что вы тестить
auto* obj = new Impl();
IB* base = obj;
Вот вторая строка и есть статик каст, и в конвенциальном коде который использует виртуальность этот каст будет один раз при инициализации указателя, т.к. обдж никому не нужен, а нужен только бэйз.
Невидимых кастов никаких нет при использовании бэйз указателя.
Да.
Да, это движение тривиально, смещение на компайл тайм константу + касты редки. Ну т.е. когда вы пишите код который наследует вот таким образом, то вы и объекты храните в контейнерах сразу через базовый указатель, а иначе зачем это все.
Это я не понял о чем вы, любой юник поинтер всегда один указатель, любой шаред поинтер зависит от реализации, но все с чем я реально сталкивался всегда 2 указателя(объект + делетер) + счётчик. И это так сделано совсем по другим причинам, это такой дизайн шаред поинтера.
Нет, эта часть тривиальна, очередной (базовый) конструктор отработал перезапишится первый ВМТ(и то один раз после конструктора базового не интерфейса) и посестится очередной вмт, опять же по фиксированным смещениям, но соглашусь это для каждого объекта, хотя обычно конструкторы вот в таких случаях совсем не тривиальны и так.
Вообще сравнивать надо яблоки с яблоками, если у вас ограничения то и в других языках нужно смотреть на реализацию с учётом таких же ограничений.
И ещё, вы тут много пишете про бест практисы, но я не очень понимаю как это у вас сочетается с оптимизацией перформанса динамик кастов. Я может отстал от жизни, но всегда считал динамик каст хаком, нарушением инкапсуляции, но готов посмотреть на ваш пример с рантайм "интроспекцией" (ну хак хаком же) где это по вашему уместно. Сразу скажу что в тех же растах у вас просто будет несколько контейнеров (а)рс где один и тот же объект боксится несколько раз по разным крэйтам и никаких динамик кастов не потребуется
Я вам ещё один хороший вопрос задам, а что на счёт сравнения вашей диспетчеризации с С++, но только наложите на с++ код те же ограничения что и у вас в языке - нет виртуального наследования, наследовать можно только одну реализацию и сколько угодно интерфейсов (классов без данных с виртуальными методами). Мне асемблер обычно не интересен и я туда не гляжу, но даётся мне что для компиляторов это первичный сценарий для оптимизаций и ставлю на то что в с++ для такого случая быстрее чем у вас.
Ну почему же, у меня вот специфическая задача, проверить перед загрузкой в память своего приложения, что мой плагин не пропатчен. Я пока вижу это так, генерирую пару пуб/приват ключи, хардкожу пуб ключ в бинарь своего приложения, подписываю приватным ключём свои сборки плагина. В приложении перед загрузкой плагина проверяю подпись с помощью захардкоженного пуб ключа. Зачем мне для этой задачи вся эта пки, какие доп гарантии это мне даст по сравнению с тем что я описал? Само приложение то будет подписано как надо, а вот плагин по простому. Приложение инсталится как положено, а вот плагин дестрибутится на флешках такова природа моего приложения.
Ну давайте в студию норм чувака который на аналогичной позиции чето добился. Не я не оправдываю, просто критерий нормальности уж слишком расплывчатый, есть много людей (и здесь кстати тоже) которые на полном серьёзе так про сталина говорят. Я вот честно признаться на таких позициях мог и покруче дичь творить и все из благих намерений, хорошо что у меня нет власти.
Назад к топику, видится мне если такие высказывания не подподают под уголовку то Маск, я думаю, защищал бы. Говорить/думать/иметь мнение различное с мэйнстримным, но не делать ничего противозаконного и пострадать за это как раз то с чем Маск и обещает помочь.
Ну что сказать, у меня по сочинениям всегда была оценка 5, только это сумма из двух за грамматика и правильная речь. Меньше 10 ошибок в тексте на 500 слов никогда не было, и вы знаете что? Оказывается, в реальной жизни, с этим диагнозом можно жить, жить нормально и не лечится (хотя я пробовал лечится - таблетки не помогают), даже в России и уж тем более там где русский это иностранный язык, но это на самом деле распространяется и на другие языки.
А я вот системный расист, вижу представителя рассы доджи/гопник сразу стараюсь перейти на другую сторону улицы и по быстрее, в контакт с такими не вступаю и вообще всячески опасаюсь. В каждой новой локации обновляю в своей голове характерные признаки людей такой рассы в этой местности и продолжаю их системно ненавидеть. Это я к тому что система распознавания похоже тоже видит что и я, поэтому правильно ее обвиняют в рассизме. /s
Нарушения нарушению рознь, я так регулярно (да и вы тоже без исключений) какое нибудь пожелание правил нарушаю ежедневно. Ну например самое частое, две полосы в частном секторе с юнитами, с обоих сторон почти все запаркованно, т.к. не у всех есть парковка во дворе или не всем хватает или ещё какие причины. По правилам я должен машины объезжать и возвращаться в свою полосу если там есть место, да ещё и как новогодняя ёлка поворотниками мигать при каждом маневре, да ещё и заранее. Так НИКТО не делает, поворотниками не сигналят вообще потому что и так всем буквально очевидны ваши и чужие маневры, в свою полосу уходят только чтобы разъехаться со встречной машиной. Т.е. по факту дорога вмещает 3 полосы, 2 крайних заняты в случайных местах и есть одна центральная общая для обоих направлений, ни одни правила это адекватно не описывают и о ужас люди как-то сами справились без них. Я это к чему, я думаю что вы сильно переоцениваете значение правил это не законы физики, игнорирования которых фатально, а просто набор букв которые пытаются с ориентировать вас в МОДЕЛИРУЕМОЙ реальности.