Andrei
стандартная реализация std::string
Andrei
в куче, как и у исключений.
Andrei
На многих платформах просто try\catch не бесплатный, а throw вообще дороженный.
Roman
Я правильно понял паттерн, что функтор возвращается вместо обычного типа?
Andrei
Ты хаскелль знаешь?
Roman
Нет, к сожалению, но понимаю концепт
Andrei
Можно рассматривать и как фунцтор в каком-то отадленном приближении. Но вообще возвращается Either
Andrei
Возвращается объект — алегбраическое произведение типов.
🦥Alex Fails
Либо то, либо тш
Roman
Так мы про хаскель или плюсы?
Andrei
Т.е. штука, у которой можно взять либо значение, либо ошибку, и флажок, который говорит что там лежит.
Andrei
Про Expected<T>
Andrei
Плюсы.
Roman
Надо почитать
Andrei
Да, обычный union + placement new
Roman
Плейсмент на стеке, соотв?
Roman
Ибо если там хип юзают на каждый объект - труба дело
Andrei
Ну всмысле я же сказал — юнион и выше написал сколько места занимает. При чем тут хип.
🦥Alex Fails
Andrei
Ничем не отличается от обычного вызова функций. Значения куда клались — туда и кладутся. И RVO работает.
Andrei
Только это RVO еще и для ошибок тоже.
Andrei
Можно спокойно сделать тип ошибки какой-нибудь uint32_t и тогда вообще throw по стоимости return получается.
Andrei
Никак. Зиро оверхед.
Andrei
И try-таки кое-что юзает. Это сильно платформ спесифик.
Roman
Не может быть зиро, на каждый возврат + байт, который надо заинитить
Andrei
Для больших x86 может и не юзает. Для других платформ хуже.
Andrei
Я имел в виду по инструкциям.
Andrei
По памяти да, на один байт на стеке больше.
Roman
Трай может быть и один глобальный на run loop - зависит от архитектуры приложения . Тогда там один раз формируется эксепшн фрейм
Andrei
Да, я все это понимаю, и я знаю как правильно писать в один ран луп трай, потому что много уже этим занимался :) но это знаю не все, и есть случаи когда это не работает.
Andrei
В частности я последнее время пишу код на корутинах.
Roman
Согласен.А вот интересно, этот байт выровненный? Как у него дела при доступе к памяти на машинах, которые умеют только aligned доступ?
Andrei
Во-первых в языке есть alignas
Roman
Т.е. Если я верну просто инт - все хорошо, а эксептед?
Andrei
А во вторых байт кладется после значения, поэтому он выровнен так же как return type
Roman
Andrei
Ну да-да, я имел в виду после значения ошибки или результат :D
Andrei
Понятно.
Roman
В общем, надо на практике посмотреть. А идея хороша
Andrei
Просто каждый раз это уточнять поленился.
Andrei
У меня есть моя реализация, которой я вдохновился у одного чувака в блоге
Andrei
Но у него было странное решение заворачивать экспешны в качестве ошибок
Andrei
И не было байндера
Andrei
Но меня вполне бы устроило так, как описано в пропозале.
🦥Alex Fails
Andrei
Бтв, в таком языке как rust "исключительные" ситуации обрабатываются именно так.
Andrei
https://isocpp.org/files/papers/n4015.pdf
🦥Alex Fails
Спс
🦥Alex Fails
Вртде ты скидывал, не заметил
Andrei
Угу. А когда в компиляторы войдет http://en.cppreference.com/w/cpp/experimental/optional/in_place_t вообще будет можно сделать еще и реализацию очень красивую.
Roman
Вообще, эксептед , фактически, это расширение подхода return codes?
Andrei
Не сказал бы. Для вызывающего кода это не выглядит так.
Andrei
Вызывающему коду надо развернуть значение из монады, поэтому у тебя не получится проигнорировать ошибку.
Roman
Разве там генерится исключение при ошибке?
Andrei
Где?
Roman
Andrei
Угу.
Roman
Надо разворачивать монаду
Andrei
Просто нельзя взять и использовать ретёрн тайп напрямую.
🦥Alex Fails
Andrei
Но если делать это как в условном хаскелле, через do нотацию или монадический биндер, то это выглядит совершенно прозрачно.
Roman
Тогда вот контр-аргумент похода https://isocpp.org/wiki/faq/exceptions#exceptions-avoid-spreading-out-error-logic
Andrei
Я успел раньше написать ответ на это контраргумент :3
Roman
И пара ответов ниже в том же факе.
Andrei
Roman
Да, Я не пытаюсь кого-то переубедить, мне интересно что вы думаете про intermixing обработки ошибок и основной логики. В моем понимании применение excepted ни чем особо не лучше return codes, кроме композиции в 1 объект
Andrei
Я про это и написал. Там нет этого смешивания т
Andrei
Наоборот. У тебя есть возможность написать как раздельную обработку ошибок так и обработку на месте.
Roman
Ок, попробую поиграться с этим
Andrei
Дело именно в связывании. Ты можешь связать excepted с двумя функциями с функцией продолжения и функцией фейла
Andrei
И ты попадешь только в одну из них.
Andrei
Поэтому в функцию успеха тебе прозрачно приходит нормально распакованное значение.
Andrei
Единственный минус - это в некотором смысле обоатный порядок записи, но это чисто плюсовая проблема.
Andrei
Другой вариант эмулировать do- нотацию
Andrei
Когда мы пишем типа
Roman
А где подробнее почитать , с примерами?
Andrei
a<-getA
b<-getB
return a+b
Andrei
Поскольку оператора <- в плюсах нет, можно сделать это хоть макросом.