C++ Russia 2017: Антон Полухин, Как делать не надо: C++ велосипедостроение для профессионалов

Поделиться
HTML-код
  • Опубликовано: 9 май 2017
  • Ближайшая конференция: С++ Russia 2024, 24 мая (online), 2-3 июня (offline, Москва)
    Подробности и билеты: jrg.su/W8skjE
    - -
    . . .

Комментарии • 51

  • @gru74ik
    @gru74ik 7 лет назад +22

    Спасибо за доклад. Было очень интересно. У Антона отлично поставлена речь. Приятно слушать.

  • @ilya.chizhanov
    @ilya.chizhanov 7 лет назад

    урааа... уже давно жду этот доклад.

  • @push2805
    @push2805 6 лет назад

    Классное видео

  • @0imax
    @0imax 3 года назад +1

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

  • @kostikvl
    @kostikvl 7 лет назад +26

    Во-первых доклад интересный, спасибо.
    Во-вторых немного дополнений насчёт COW-строк (в районе 6:15)
    1. Я не понимаю, почему за синхронизацией COW строки должна следить сама строка и зачем там появляется атомарный счётчик. Мы можем задокументировать, что она не thread-safe и переложить синхронизацию на пользователя.
    2. Как указали в блоке вопросов, семантика перемещения не всегда заменяет COW, потому что речь может идти о многократно совместно используемых строках (скажем тысяча строк "John" одновременно живёт в программе) и тогда COW тупо экономит память. Тут надо было рассказать, что есть нормативные методы решать такие задачи также не изобретая велосипедов, например boost::flyweight
    3. Отсутствие в стандарте COW-варианта строки как раз и означает необходимость снова и снова изобретать этот велосипед. В плане предостережения от велосипедостроения тут я бы дал ссылку на какую-нибудь заведомо хорошую реализацию "если вам всё-таки уж очень нужна COW-строчка".

    • @knst
      @knst 6 лет назад +8

      > 1. Я не понимаю, почему за синхронизацией COW строки должна следить сама строка и зачем там появляется атомарный счётчик. Мы можем задокументировать, что она не thread-safe и переложить синхронизацию на пользователя.
      Смотрите:
      string a = "abc";
      string b = a;
      Запускаем process(a) в треде 1, запускаем process(b) в треде 2. Мы имеем 2 разных переменных в двух разных тредах, но они обе указывают на одну область памяти, нужно обеспечить из-за COW thread-safe для обоих тогда когда он как раз и не нужен. И на пользователя переложить нельзя, потому что это "кишки".

    • @Ivan-qb7kc
      @Ivan-qb7kc 5 лет назад

      1. C++ - не Rust, который заботливо проследит, чтобы не thread-safe структуры данных не использовались в многопоточном контексте.

  • @jeka987
    @jeka987 2 дня назад

    32:00 54:50 1:22:15 Почему не надо писать на C++. Ты обязан знать контекст каждой используемой «ф-ции» как она зависит от третьей стороны и т.д. Похоже на разбор «кишков» языка, вместо перекладывания этих обязанностей на компилятор

  • @vladimir0rus
    @vladimir0rus 4 месяца назад

    8:40 многопоточность была и на одноядерных процессорах, уже на win95/unix/linux можно было словить race condition.

  • @user-bu5hg5ru3d
    @user-bu5hg5ru3d 2 года назад +1

    44:00 полезные советы

  • @frolish9344
    @frolish9344 7 месяцев назад +1

    1:41:10, задефайнить форс инлайн пустотой)

  • @sigasigasiga
    @sigasigasiga Год назад

    43:00 если warning'и не ловятся, можно бинарным поиском найти бажные файлы)

  • @iliasalaur
    @iliasalaur 2 года назад +2

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

    • @streamdx
      @streamdx 2 года назад +2

      Главное в преждевременную оптимизацию не ввязаться случайно))
      Но на 8-битниках нужно конечно стараться, да

  • @avazart614
    @avazart614 4 года назад +2

    Велосипеды пишут потому что STL часто не предоставляет всех необходимых возможностей.
    Например почему нет в STL нечто вроде result= join(thread1,thread2,waitMode) по аналогии с WaitForMultipleObjects() в WinApi.
    По чему в STL до сих пор не перенесли из boost алгоритм trim().
    Казалось бы банальная и простая но нужная вещь. (например что бы отсекать пробелы в пользовательском вводе) тоже касается других ф-ций которые привычны для работы со строками.

    • @qeqsiquemechanical9041
      @qeqsiquemechanical9041 3 года назад

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

  • @wizaral
    @wizaral 2 года назад

    1:27:58 было бы интересно услышать ответ на тот же вопрос, но с unordered_map

  • @AxelStrem
    @AxelStrem 7 лет назад

    и правда latency от целочисленного DIV, но без кэша надо еще время на i2f добавить, а это ад

  • @northkoreaua
    @northkoreaua 3 года назад +1

    55:27 еще липман в книге которая времен динозавров писал что тип инстанса может быть полиморфным или нет. byVal инстанс - не полиморфный. какой вирт метод звать мы именно поэтому знаем во время компиляции. тут не в final магия

    • @user-yq9zf6qb2o
      @user-yq9zf6qb2o 3 года назад

      Имелся введу указатель на some_implementation. Какраз если знаем что нет наследников и что класс final и метод имплементирован то можем вызывать сразу этот метод, так как переопределить его никто не сможет (мы final).

  • @Elias-dj1ge
    @Elias-dj1ge 4 года назад +2

    Ох, сколько бед мы поимели из-за старого кода + strict aliasing.

  • @vladimir0rus
    @vladimir0rus 5 лет назад +4

    Ссылки из видео на выступления Chandler Carruth (примерно на 39:25)
    ruclips.net/video/FnGCDLhaxKU/видео.html
    ruclips.net/video/nXaxk27zwlk/видео.html

  • @MacIn173
    @MacIn173 7 лет назад

    Зачем на 16:39 производится работа с атомарным счетчиком при каждом обращении к строке по [], если счетчик должен по сути увеличиваться только при копировании строки и уменьшаться при ее деструкции, выходе из scope'а? При работе с элементом строки через [] мы уже по определению работает с буфером, которым владеем. Не понимаю этой детали реализации.

    • @user-kx3zg5bj9o
      @user-kx3zg5bj9o 7 лет назад

      Представь что у тебя есть 2 объекта строки
      std::string s1 = "bla bla bla";
      std::string s2 = s1;
      ASSERT(s1.impl == s2.impl); // Для простоты, представим что impl - public
      Теперь ты хочешь промодифицировать первую строку, а вторую оставить как есть
      s1[0] = 'B';
      ASSERT(s1 == "Bla bla bla");
      ASSERT(s2 == "bla bla bla");
      ASSERT(s1.impl != s2.impl);
      Отвечая на твой вопрос: При вызову неконстатного оператора[], должно произойти копирование объекта, иначе после инструкции s1[0] = 'B'; измененятся обе строки.

    • @MacIn173
      @MacIn173 7 лет назад

      Ах да, действительно. Спасибо. В С++ получится именно так, я думал о COW вне контекста именно плюсов. Так-то можно вызвать "сделать копию" только перед первым [].

    • @HedgehogInTheCPP
      @HedgehogInTheCPP 5 лет назад +1

      @@MacIn173 а дело не в плюсах, как раз правильно написал Konstantin Vladimirov выше: нужно тонкости синхронизации переложить в зависимости от пользовательского кейса, УНИВЕРСАЛЬНОЙ реализации COW не существует иначе получится просто неэффективное решение.

  • @sergeiepatov7683
    @sergeiepatov7683 3 года назад

    Если бы велосипеды не переизобретались каждый год, все до сих пор ездили бы на костотрясах :)

  • @andreykarpov3381
    @andreykarpov3381 6 лет назад

    В продолжение темы про оптимизацию строк: ruclips.net/video/QU63wpGBvjE/видео.html

  • @ilya.chizhanov
    @ilya.chizhanov 7 лет назад +11

    Где взять такую толстовку?

    • @HedgehogInTheCPP
      @HedgehogInTheCPP 5 лет назад +1

      Вступить в РГ21 стандарта? )

  • @alexeykargojarvinen5273
    @alexeykargojarvinen5273 Год назад +1

    превратили ++ в мутанта # и java.

  • @morglod
    @morglod Год назад

    30:45
    если вылетит исключение которое не поймали то программа аварийно завершится
    ну да, так и есть

    • @TRuMPonSound
      @TRuMPonSound 3 месяца назад

      Его поймали где-то выше, но при этом все равно сработает неструктор на уже удалённых данных

  • @alexnedelin7646
    @alexnedelin7646 4 месяца назад

    ходила байка про class stroka из яндекса

  • @deadblue6064
    @deadblue6064 4 года назад +6

    Сложна, сложна, очинь сложна.

  • @IExSet
    @IExSet 5 месяцев назад

    Меня мучают смутные сомнения, внутри умных указателей сейчас атомик, не будет ли это тормозить ядра, как в примере с COW строками ?

    • @TRuMPonSound
      @TRuMPonSound 3 месяца назад

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

    • @vstaroseltsev
      @vstaroseltsev 2 месяца назад

      Тормозить по сравнению с чем? Если вас интересует вопрос, тормозят ли shared_ptr, то да, и очень сильно. Вы сами можете тесты на производительность написать, например, сравнивая как быстрее передавать их в аргументах функций. Разница между передачей по значению и по ссылке может достигать в 10 раз, причем boost::shared_ptr и std::shared_ptr отличаются по скорости в зависимости от компилятора.

  • @vladimir0rus
    @vladimir0rus 4 месяца назад

    анонимные неймспейсы зло

  • @apivovarov2
    @apivovarov2 4 года назад +1

    лучше говорить про изобретение колеса, иначе заграницей вас не поймут.

    • @sergeiepatov7683
      @sergeiepatov7683 3 года назад +3

      Alexander Pivovarov Доклад-то по русски. Если бы говорил за границей, то да.

  • @zz1965Serg
    @zz1965Serg 7 лет назад +23

    Трындец! Слава те Господи что кернел писан на голом Ц !!!!

    • @assert_null
      @assert_null 5 лет назад +7

      Да большинство кейсов и к Си применимо.

  • @musx5127
    @musx5127 3 года назад

    Привет всем! сделайте плиз доброе дело? нигде не нашел как это решать на с++, тока на Паскале.
    Спасибо тому кто решит
    Спортсмен Василий участвовал в соревнованиях по хоккей болу и получил в личном зачете серебряную медаль. Известно, что участники, получившие одинаковое количество очков, награждаются одинаковыми наградами. Известно, что были разыграны золотые серебряные и бронзовые медали. В задаче не спрашиваются правила хоккей бола. Необходимо только определить, сколько очков набрал Василий. Для решения данной задачи массив лучше не использовать. Формат входного файла На первой строке дано число N (2

  • @GrinyaPLAY
    @GrinyaPLAY 4 года назад +1

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

    • @Dmytro-Tsymbaliuk
      @Dmytro-Tsymbaliuk 3 года назад

      так реально медленно, на плюсах тоже самое можно написать намного быстрее

    • @artyomviktorov4163
      @artyomviktorov4163 3 года назад +3

      Надеюсь это шутка

    • @0imax
      @0imax 3 года назад +1

      Проблема в том, что одного Вас, гениального, который на асме пишет так же быстро, как на С++, недостаточно, И клонировать и раздать всем софтверным конторам тоже нельзя)))

    • @user-se5wc1lq6r
      @user-se5wc1lq6r 2 года назад +3

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

  • @ProTyperforMegatypers
    @ProTyperforMegatypers 7 лет назад

    Программа написанная под сервис для разгадывания капчи.Программа написана на С++ 6-8 версии. Ничем не упакована и не защищена.Исходника нет.
    При регистрации акаунта через программу в конце нужно кликнуть подтверждение (Я не робот) . Эту капчу программа не видит - следовательно регистрацию закончить невозможно! Этот момент нужно исправить
    За более подробной информацией пишите в ICQ - 681354647
    Бюджет 100$

    • @Snpefk
      @Snpefk 3 года назад +1

      предложение всё еще в силе?