А Вы считаете, что обязаловка както решает эту проблему? Я брал студентов в команду и у меня негативный опыт по работе с ними (больше не беру), но в соседней команде из пяти человек двое остались и выросли до мидлов, отработав в компании по 4+ лет. Обязаловка лишь дает возможность принимающей стороне снизить требования к удержанию, и работа получается за скорее страх, а не за совесть. Могу вам рассказать интересное наблюдение, которое я практиковал у себя в команде, через 3 месяца я выбивал у начальства безусловное повышение зп на 5-10% (делая скидку на активность человека), в ответ обычно получал лучшие месячные показатели по задачам и большую лояльность в целом.
Крупные компании, те что что были поумнее, имели прямые контакты с нужными кафедрами и "субсидировали" преподавателей и универ задолго до этого, за что им рекомендовали мозговитых студентов уже курсе на третьем. Т.е. чегото нового тут нет, другой вопрос как это обставят, если это протолкнут в виде "закона".
Не очень понял вопрос. Для TAD и CTAD ипользуются разные стратегии. TAD в C++ несведен к Hindley-Milner. Это совершенно другой механизм с другими правилами, ограничениями и свойствами и использует специализированные алгоритмы паттерн-матчинга, а не унификацию HM. Для CTAD точно не помню, вроде бы создается вымышленная функция-шаблон, где выполняется вывод аргументов и разрешение перегрузки, но лучше у гугла спросить.
Как то маловато у вас аллокаторов нашлось, их точно больше 10 https://habr.com/ru/articles/876804/. Время аллокации не меряют в нс, потому что наносекунды - это когда произошло, например измеряете latency с точки зрения пользователя, времея загрузки или I/O операции. Это как мерять скорость количеством заячьих прыжков, какое то понимание будет, но не то что вы рассчитываете. Время аллокации измеряется количеством тактов процессора, включая простои.
"Cache locality. Объекты, выделенные в разное время, разбросаны по памяти" - Ok, ну разбросаны, да по всей памяти, но мы к ним часто обращаемся и они постоянно сидят в кеше, при чем здесь локальность данных? А вы знаете что она бывает временная, пространственная, по типу, фазам, потокам и инструкциям. Видимо не знаете ибо чатгпт про это вам не сказал.
"Деаллокация отдельных объектов невозможна" - концептуально неверно, у неё есть адрес и метаданные, в чем проблема освободить аллокацию? Возможна, просто сброс всей арены будет дешевле, но об этом только одно предложение. Pool работает с "одним типом" - это неверно, он вообще не знает про ваши типы, а работает с одинаковым размером, это не одно и тоже. "Тысячи частиц рождаются и умирают каждый кадр" - вы представляете эту хрень на экране? с пулом это будет чуть быстрее чем с маллоком, но видимо и тут чатгпт не подсказал, что пул сделан не для этих вещей. Дальше читать не стал ибо вообще дичь пошла. Если вы и на курсах учите в таком же стиле мне жалко ваших студентов.
В целом да(алсотру там в понимании что он даст для Т тоже тру), но я хотел показать что два логически одинаковых условия дают true, и верхний ведь тоже true, будут семантически разными концептами, хотя логически они одинаковы. Поэтому там ниже идет объяснение что коценты это не логические выражения, а семантические и если вы видите в коде два концепта А || В и В || А в разных частях, то есть большая вероятность словить интересные баги
Я рассказывал почему так получилось - requires и constraints в плюсах это не логическая система, и они не задумывались как логическая система в математическом смысле. То что мы накидываем туда знакомые понятие это уже другое, можно знаете ли и на constexpr решить "задачу восьми королев", но зачем? Это прежде всего механизм частичного упорядочивания перегрузок и шаблонов, встроенный в уже существующую (и крайне хрупкую) модель разрешения перегрузок, чтобы ответить на очень практический вопрос компилятора: какая из двух функций более ограниченная и, значит, более предпочтительная, а не эквивалентны ли два логических высказывания. Иначе мы рискуем втащить еще что-нибудь такое, от чего потом придется еще 20 лет избавляться или получим еще одни макросы
Отличный перевод, отличной статьи, причем довольно свежей. "Таким образом, этот «знак» (ссылочный тип rvalue) сообщает компилятору, что нужно выбрать перемещающий конструктор",подумал тут особенность перевода, но нет - тут неточность у автора (дайте немного подушнить): std::move возвращает xvalue, а не просто "rvalue ссылочный тип" и вот xvalue будет подкатегорией выражения и она может отличаться от rvalue (наряду с prvalue). Дальше это показывается на диаграмме, а у меня там белый блок вместо картинки, и получается, что в тексте формулировка размыта.
Вы не один это видите - это понимают вообще все, в том числе и комитет (я както говорил на конференции с @antoshkka об этом, там работают очень умные люди, которые прекрасно видят и технический долг и архитектурные проблемы языка) Радикальный разрыв тут просто невозможен, пока язык реально используется в проде, и именно поэтому вместо красивого перезапуска мы видим concepts, modules и constraints, в виде медленных шажков. Разбивка по файлам, о которой Вы сказали и TU это чисто про генерацию кода, а не про семантику языка (name lookup, overload resolution, правила шаблонов, ADL, ODR, ABI) должно быть одинаковым во всей программе, иначе компоновка будет давать разные результаты при каждой перекомпиляции (это один из моментов), если ввести разные модели языка, условно старую и новую, то у нас отваливается ODR (тут вам больше ребята с конференций расскажут). И вы забываете про вендоров, если ктото из большой тройки говорит - нет, мы не можем это сделать, комитет под козырек и откладывает на следующий стандарт.
Тут просто важно напомнить, откуда всё это взялось. Плюсы все же очень старый язык (40+?) и он десятилетиями развивался так, чтобы ничего не ломать из уже написанного кода, ну и он тоже из ниоткруда не появился, а взял часть сях, часть smalltalk, tcl и чего там еще было в начале, поэтому он не может просто взять и «переделать систему типов заново», вы банально все сломаете и даже ваша кошка будет смотреть на вас осуждающе. Поэтому все новые штуки, вроде концептов concepts, приходится аккуратно надстраивать поверх старых шаблонов, SFINAE и прочего исторического багажа и ничего с этим не поделать. Может из-за этого они иногда выглядят как костыли, хотя по сути это эволюция.
Rust оказался, кмк, в куда более удобной позиции, поскольку стартовал с чистого листа. Можно было сразу сказать: вот у нас traits, вот тут такие правила, вот вам такая строгая модель типов и никаких компромиссов ради кода, написанного дцать а то и больше лет назад, поэтому всё выглядит «правильно».
При этом rust на самом деле очень много взял из C++, тотже RAII, zero-cost abstractions, общее мышление про производительность, но он смог взять эти идеи уже в отшлифованном виде и встроить их в язык сразу, а не задним числом и не через три п.... извините за мой французский.
Так что концепты в плюсахэто не попытка догнать rust, а попытка как-то наконец-то официально оформить то, чем люди пользовались годами, если не десятилетиями, через enable_if, type traits и прочие трюки. Ну да, выглядит менее элегантно, но работает и не ломает экосистему.
В общем, rust просто повезло родиться позже и у хороших родителей и навеное это нормально. Если я тут что-то про rust обидное сказал, прошу извинить, язык не использую, иногда почитываю блоги.
не получится, потому что любая попытка стереть тип у строк упирается в несовместимость моделей представления данных, а не в отсутствие абстракции. Если возвращать условныйchar32_t то придется декодировать UTF-8/UTF-16/UTF-32, которые тоже разные. Получается что type erasure превращается в полноценный transcoding layer и очередной тринадцатый станадарт и несет огромные накладные расходы, значит это уже не совсем укладывается стринг вьюху, т.е. пока это не будет сделано на уровне языка как единое решение, так или иначе разные библиотеку будут велосипедить своЁ
Ну много да, года до 2015 почти четверть штатовского игрового аутсорса уходило в СНГ. Щас конечно поменьше, но платить ООО "ТехКранч" десятую часть тамошней разработки, получая сравнимое, а зачастую и повыше качество, для многих является решаюшим фактором независимо от лозунгов и цвета волос потуса. А оставшиеся 2% можно и пропить
А Вы считаете, что обязаловка както решает эту проблему? Я брал студентов в команду и у меня негативный опыт по работе с ними (больше не беру), но в соседней команде из пяти человек двое остались и выросли до мидлов, отработав в компании по 4+ лет. Обязаловка лишь дает возможность принимающей стороне снизить требования к удержанию, и работа получается за скорее страх, а не за совесть. Могу вам рассказать интересное наблюдение, которое я практиковал у себя в команде, через 3 месяца я выбивал у начальства безусловное повышение зп на 5-10% (делая скидку на активность человека), в ответ обычно получал лучшие месячные показатели по задачам и большую лояльность в целом.
это что-то на темно-эльфиском, вероятно, потому что чатик не справился с переводом /s
вы забыли точку поставить в 1600 000, координата из двух частей состоит и должно быть 1600.000 /s
Крупные компании, те что что были поумнее, имели прямые контакты с нужными кафедрами и "субсидировали" преподавателей и универ задолго до этого, за что им рекомендовали мозговитых студентов уже курсе на третьем. Т.е. чегото нового тут нет, другой вопрос как это обставят, если это протолкнут в виде "закона".
Не очень понял вопрос. Для TAD и CTAD ипользуются разные стратегии. TAD в C++ не сведен к Hindley-Milner. Это совершенно другой механизм с другими правилами, ограничениями и свойствами и использует специализированные алгоритмы паттерн-матчинга, а не унификацию HM. Для CTAD точно не помню, вроде бы создается вымышленная функция-шаблон, где выполняется вывод аргументов и разрешение перегрузки, но лучше у гугла спросить.
пожалуйста, ненада
таким очень любят баловаться в легаси, отчего можно словить много интересных глюков.
Благодарю, перефразировал.
Лучше читать с первой или со второй, эта не очень самостоятельная, тогда будет понятно откуда ноги.
Как то маловато у вас аллокаторов нашлось, их точно больше 10 https://habr.com/ru/articles/876804/. Время аллокации не меряют в нс, потому что наносекунды - это когда произошло, например измеряете latency с точки зрения пользователя, времея загрузки или I/O операции. Это как мерять скорость количеством заячьих прыжков, какое то понимание будет, но не то что вы рассчитываете. Время аллокации измеряется количеством тактов процессора, включая простои.
"Cache locality. Объекты, выделенные в разное время, разбросаны по памяти" - Ok, ну разбросаны, да по всей памяти, но мы к ним часто обращаемся и они постоянно сидят в кеше, при чем здесь локальность данных? А вы знаете что она бывает временная, пространственная, по типу, фазам, потокам и инструкциям. Видимо не знаете ибо чатгпт про это вам не сказал.
"Деаллокация отдельных объектов невозможна" - концептуально неверно, у неё есть адрес и метаданные, в чем проблема освободить аллокацию? Возможна, просто сброс всей арены будет дешевле, но об этом только одно предложение.
Pool работает с "одним типом" - это неверно, он вообще не знает про ваши типы, а работает с одинаковым размером, это не одно и тоже.
"Тысячи частиц рождаются и умирают каждый кадр" - вы представляете эту хрень на экране? с пулом это будет чуть быстрее чем с маллоком, но видимо и тут чатгпт не подсказал, что пул сделан не для этих вещей.
Дальше читать не стал ибо вообще дичь пошла.
Если вы и на курсах учите в таком же стиле мне жалко ваших студентов.
А что насчет ошибок и остановки в месте ошибки, с возможностью перегрузить песочницу после исправления? Выглядит как естественное решение.
В целом да(алсотру там в понимании что он даст для Т тоже тру), но я хотел показать что два логически одинаковых условия дают true, и верхний ведь тоже true, будут семантически разными концептами, хотя логически они одинаковы. Поэтому там ниже идет объяснение что коценты это не логические выражения, а семантические и если вы видите в коде два концепта А || В и В || А в разных частях, то есть большая вероятность словить интересные баги
Я рассказывал почему так получилось - requires и constraints в плюсах это не логическая система, и они не задумывались как логическая система в математическом смысле. То что мы накидываем туда знакомые понятие это уже другое, можно знаете ли и на constexpr решить "задачу восьми королев", но зачем? Это прежде всего механизм частичного упорядочивания перегрузок и шаблонов, встроенный в уже существующую (и крайне хрупкую) модель разрешения перегрузок, чтобы ответить на очень практический вопрос компилятора: какая из двух функций более ограниченная и, значит, более предпочтительная, а не эквивалентны ли два логических высказывания. Иначе мы рискуем втащить еще что-нибудь такое, от чего потом придется еще 20 лет избавляться или получим еще одни макросы
Отличный перевод, отличной статьи, причем довольно свежей.
"Таким образом, этот «знак» (ссылочный тип rvalue) сообщает компилятору, что нужно выбрать перемещающий конструктор", подумал тут особенность перевода, но нет - тут неточность у автора (дайте немного подушнить):
std::moveвозвращает xvalue, а не просто "rvalue ссылочный тип" и вот xvalue будет подкатегорией выражения и она может отличаться от rvalue (наряду с prvalue). Дальше это показывается на диаграмме, а у меня там белый блок вместо картинки, и получается, что в тексте формулировка размыта.Вы не один это видите - это понимают вообще все, в том числе и комитет (я както говорил на конференции с @antoshkka об этом, там работают очень умные люди, которые прекрасно видят и технический долг и архитектурные проблемы языка) Радикальный разрыв тут просто невозможен, пока язык реально используется в проде, и именно поэтому вместо красивого перезапуска мы видим concepts, modules и constraints, в виде медленных шажков. Разбивка по файлам, о которой Вы сказали и TU это чисто про генерацию кода, а не про семантику языка (name lookup, overload resolution, правила шаблонов, ADL, ODR, ABI) должно быть одинаковым во всей программе, иначе компоновка будет давать разные результаты при каждой перекомпиляции (это один из моментов), если ввести разные модели языка, условно старую и новую, то у нас отваливается ODR (тут вам больше ребята с конференций расскажут). И вы забываете про вендоров, если ктото из большой тройки говорит - нет, мы не можем это сделать, комитет под козырек и откладывает на следующий стандарт.
Тут просто важно напомнить, откуда всё это взялось. Плюсы все же очень старый язык (40+?) и он десятилетиями развивался так, чтобы ничего не ломать из уже написанного кода, ну и он тоже из ниоткруда не появился, а взял часть сях, часть smalltalk, tcl и чего там еще было в начале, поэтому он не может просто взять и «переделать систему типов заново», вы банально все сломаете и даже ваша кошка будет смотреть на вас осуждающе. Поэтому все новые штуки, вроде концептов concepts, приходится аккуратно надстраивать поверх старых шаблонов, SFINAE и прочего исторического багажа и ничего с этим не поделать. Может из-за этого они иногда выглядят как костыли, хотя по сути это эволюция.
Rust оказался, кмк, в куда более удобной позиции, поскольку стартовал с чистого листа. Можно было сразу сказать: вот у нас traits, вот тут такие правила, вот вам такая строгая модель типов и никаких компромиссов ради кода, написанного дцать а то и больше лет назад, поэтому всё выглядит «правильно».
При этом rust на самом деле очень много взял из C++, тотже RAII, zero-cost abstractions, общее мышление про производительность, но он смог взять эти идеи уже в отшлифованном виде и встроить их в язык сразу, а не задним числом и не через три п.... извините за мой французский.
Так что концепты в плюсах это не попытка догнать rust, а попытка как-то наконец-то официально оформить то, чем люди пользовались годами, если не десятилетиями, через enable_if, type traits и прочие трюки. Ну да, выглядит менее элегантно, но работает и не ломает экосистему.
В общем, rust просто повезло родиться позже и у хороших родителей и навеное это нормально. Если я тут что-то про rust обидное сказал, прошу извинить, язык не использую, иногда почитываю блоги.
Спасибо, поправил
У вас еще скидка хорошая, мне вот только промокод предлагают. @OlegSivchenko ^ яндекс балуется?
не получится, потому что любая попытка стереть тип у строк упирается в несовместимость моделей представления данных, а не в отсутствие абстракции. Если возвращать условный
char32_tто придется декодировать UTF-8/UTF-16/UTF-32, которые тоже разные. Получается что type erasure превращается в полноценный transcoding layer и очередной тринадцатый станадарт и несет огромные накладные расходы, значит это уже не совсем укладывается стринг вьюху, т.е. пока это не будет сделано на уровне языка как единое решение, так или иначе разные библиотеку будут велосипедить своЁНу много да, года до 2015 почти четверть штатовского игрового аутсорса уходило в СНГ. Щас конечно поменьше, но платить ООО "ТехКранч" десятую часть тамошней разработки, получая сравнимое, а зачастую и повыше качество, для многих является решаюшим фактором независимо от лозунгов и цвета волос потуса. А оставшиеся 2% можно и пропить