@hirthwork

Тег c++ в блоге hirthwork

hirthwork

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

hirthwork

напомните, как в XXI веке моднее всего вызвать в конструкторе функцию возвращающую void, до того как проинициализируется первое поле? А то писать фейковый класс VoidFunctionCaller мне как-то лень

hirthwork

Оказывается, при выбросе исключения деструкторы объектов будут вызваны только если эксепшен был пойман в catch. В противном случае вызов деструкторов implementation-defined. И тебе может не понравиться тот define, который выбрал твой implementation, %username%. Пруф: https://stackoverflow.com/a/39963032

hirthwork

Скажите, а что это за ебанутая мода объявлять функцию auto my_func() -> my_type; вместо my_type my_func();?
От этого что, писюн длиннее становится что ли? Потому ни краткости, ни читабельности коду это точно не придаёт

hirthwork

функция парсинга и валидации конфига — 66 строк
функция которая выполняет всю работу — 40 строк

hirthwork

У меня вопрос к сообществу касательно strong guarantee и moveable объектов.
Допустим, у меня есть функция, которая кладёт в мапу данные ассоциированные с айдишником объекта, а затем отдаёт айдишник в какой-то коллбек, который может пофейлиться (но не кинуть эксепшен):

auto iter = map.emplace(id, std::move(data));
if (!callback(id)) {
    map.erase(iter.first);
}

Проблем в этом коде две:
1. По хорошему, данными должен владеть коллбек. Но не владеет и с этим я ничего сделать не могу
2. В данном куске кода нарушается strong guarantee — если коллбек пофейлился, то data уже мувнулся и данные потерялись. И вот с этим я что-то сделать могу.

Первая мысль, что пришла в голову — можно не мувать, а использовать shared_ptr (всё равно там уже данные лежат в unique_ptr). Но моя религия запрещать использовать атомик каунтеры, там где можно обойтись без них.
Вторая мысль была о том, чтобы перед вызовом erase возвращать данные обратно:

auto iter = map.emplace(id, std::move(data));
if (!callback(id)) {
    std::swap(data, iter.first->second);
    map.erase(iter.first);
}

Скажите, насколько такой подход корректен?

З.Ы. Рассуждения ведутся в контексте:
https://github.com/hirthwor.../src/fs.hpp#L97-L105
https://github.com/hirthwor...s/lookup.cpp#L59-L70

hirthwork

у гоцацэ какие-то ебанутые варнинги в -Wextra.
Вот так писа́ть нельзя: struct s{}; struct s2{s*s;};
А вот так можно: struct s{}; void f(s*s){(void)s;}

hirthwork

Мне так понравились поначалу свежие плюсцы, что я прям не знал как же так, неужели никакого говна в новых плюсах нет? Нашёл! В этом говноязыке нету std::make_unique_lock и std::make_shared_lock! Говно, а не язык. Можно обмазываться.

hirthwork

ISO/IEC 14882 Draft №4606 §23.2.4 Associative containers

9 The insert and emplace members shall not affect the validity of iterators and references to the container, and the erase members shall invalidate only iterators and references to the erased elements.

hirthwork

Кстати, после вчерашнего опыта со свежими плюсами я осознал насколько расточительно расходуется память при работе с C++03: на каждый чих по аллокации. Хочешь добавить элемент в std::vectory<std::string>? Получай лишнюю аллокацию! Добавление вывело size за capacity? АХАХАХА! ТЫСЯЧИ АЛЛОКАЦИЙ!
В общем, это, C++14 — нормик. Стандартная библиотека пока ещё отсасывает в плане доступа к элементам ОС, но в целом это оказался очень большой шаг вперёд.

hirthwork

хотел было написать, что мне не хватает в джаве private наследования, а потом понял, что в плюсах просто не сделаешь таких красивых вещей ради которых мне не хватает в джаве private наследования

hirthwork

#iarcv/11 мне напомнил случай года четыре назад, когда я ещё был плюсоблядью в яндексе
нужен мне был какой-то паттерн синхронизации, в дебрях кода нашёл я уже готовую реализацию. посмотрел — а там на каждый чих мьютекс используется.
я был ещё зелен и, кажется, двадцатипятилетний. решил выебнуться сделать паттерн шаблонным и запихнуть туда спинлок
сделал, довольный собой послал на ревью. ревьювер спросил: «А ты сравнил производительность?»
в общем, оказалось, что реализация на спинлоках вышла на порядок медленнее. с тех пор я стал куда меньше выёбываться своими «знаниями примитивов синхронизации»

hirthwork

Выбери компилятор. Выбери libc. Выбери версию стандарта. Выбери реализацию STL. Выбери систему сборки. Выбери правила именования. Выбери правила расстановки скобок. Выбери набор разрешённый ворнингов при компиляции. Выбери порядок включения заголовочных файлов, рекомендации по использованию макросов, набор тайпдефов, которые все обязаны использовать. Выбери себе UB, чтобы было с чем поебаться в ночь с субботы на воскресенье. Выбери метапрограммирование. Выбери слой абстракции над ОС. Выбери обёртку над gdb. Выбери будущее. Выбери C++… Но зачем мне всё это? Я не стал выбирать C++… Я выбрал кое-что другое… Причины? Какие могут быть причины, когда есть Java?

hirthwork

Я не должен C++.
C++ убивает разум.
C++ есть задротство, влекущее за собой окончательное унижение.
Но я встречу C++ и приму его.
Я позволю ему пройти надо мной и сквозь меня.
А когда он пройдёт через меня, я обращу свой внутренний взор на его путь;
И там, где был C++, не останется ничего.
Останусь лишь я сам.

hirthwork

посоветуйте модный thread safe LRU cache

hirthwork

а где в интернетах сводятся воедино все упущения в C++? ну типа отсутствие автоматического noexcept, который вчера обсуждали в #tboga или там требование конструирования виртуальных базовых в абстрактных классах

hirthwork

achievement unlocked: скатить политосрач в плюсосрач. пруф: #tboga

hirthwork

поцчему в C++11 нельзя при компиляции указать, что new должен не std::bad_alloc кидать, а делать abort()? мои программы всё равно OOM пережить не могут. а так — куча методов стали бы сразу noexcept и всё типа получше мог бы компилятор соптимизировать

hirthwork

вот std::set::find сделали шаблонным, а почему std::unordered_set::find не догадались шаблонным сделать?

hirthwork

почему даже в C++14 компилятор ругается на 24ю строку? http://ideone.com/ifeDVn почему нельзя мувнуть лямбду с мувабл капчурами?

Добавить пост

Вы можете выбрать до 10 файлов общим размером не более 10 МБ.
Для форматирования текста используется Markdown.