
Roman
23.04.2016
08:03:42
Надо почитать

Andrei
23.04.2016
08:03:53
Да, обычный union + placement new

Roman
23.04.2016
08:04:23
Плейсмент на стеке, соотв?

Плюшка
23.04.2016
08:04:24
круть

Google

Roman
23.04.2016
08:04:50
Ибо если там хип юзают на каждый объект - труба дело

Andrei
23.04.2016
08:05:36
Ну всмысле я же сказал — юнион и выше написал сколько места занимает. При чем тут хип.

Alex Фэils?︙
23.04.2016
08:05:38

Andrei
23.04.2016
08:06:07
Ничем не отличается от обычного вызова функций. Значения куда клались — туда и кладутся. И RVO работает.
Только это RVO еще и для ошибок тоже.
Можно спокойно сделать тип ошибки какой-нибудь uint32_t и тогда вообще throw по стоимости return получается.

Roman
23.04.2016
08:18:51

Andrei
23.04.2016
08:19:18
Никак. Зиро оверхед.
И try-таки кое-что юзает. Это сильно платформ спесифик.

Roman
23.04.2016
08:20:03
Не может быть зиро, на каждый возврат + байт, который надо заинитить

Andrei
23.04.2016
08:20:41
Для больших x86 может и не юзает. Для других платформ хуже.
Я имел в виду по инструкциям.

Google

Andrei
23.04.2016
08:21:09
По памяти да, на один байт на стеке больше.

Roman
23.04.2016
08:22:11
Трай может быть и один глобальный на run loop - зависит от архитектуры приложения . Тогда там один раз формируется эксепшн фрейм

Andrei
23.04.2016
08:23:02
Да, я все это понимаю, и я знаю как правильно писать в один ран луп трай, потому что много уже этим занимался :) но это знаю не все, и есть случаи когда это не работает.
В частности я последнее время пишу код на корутинах.

Roman
23.04.2016
08:23:54
Согласен.А вот интересно, этот байт выровненный? Как у него дела при доступе к памяти на машинах, которые умеют только aligned доступ?

Andrei
23.04.2016
08:24:15
Во-первых в языке есть alignas

Roman
23.04.2016
08:24:32
Т.е. Если я верну просто инт - все хорошо, а эксептед?

Andrei
23.04.2016
08:24:44
А во вторых байт кладется после значения, поэтому он выровнен так же как return type

Roman
23.04.2016
08:25:22

Andrei
23.04.2016
08:26:20
Ну да-да, я имел в виду после значения ошибки или результат :D
Понятно.

Roman
23.04.2016
08:26:28
В общем, надо на практике посмотреть. А идея хороша

Andrei
23.04.2016
08:26:37
Просто каждый раз это уточнять поленился.
У меня есть моя реализация, которой я вдохновился у одного чувака в блоге
Но у него было странное решение заворачивать экспешны в качестве ошибок
И не было байндера
Но меня вполне бы устроило так, как описано в пропозале.

Alex Фэils?︙
23.04.2016
08:28:09

Andrei
23.04.2016
08:28:47
Бтв, в таком языке как rust "исключительные" ситуации обрабатываются именно так.
https://isocpp.org/files/papers/n4015.pdf

Google

Alex Фэils?︙
23.04.2016
08:30:52
Спс
Вртде ты скидывал, не заметил

Andrei
23.04.2016
08:36:49
Угу. А когда в компиляторы войдет http://en.cppreference.com/w/cpp/experimental/optional/in_place_t вообще будет можно сделать еще и реализацию очень красивую.

Roman
23.04.2016
08:37:25
Вообще, эксептед , фактически, это расширение подхода return codes?

Andrei
23.04.2016
08:38:15
Не сказал бы. Для вызывающего кода это не выглядит так.
Вызывающему коду надо развернуть значение из монады, поэтому у тебя не получится проигнорировать ошибку.

Roman
23.04.2016
08:39:05
Разве там генерится исключение при ошибке?

Andrei
23.04.2016
08:39:14
Где?

Roman
23.04.2016
08:39:29

Andrei
23.04.2016
08:39:41
Угу.

Roman
23.04.2016
08:39:45
Надо разворачивать монаду

Andrei
23.04.2016
08:40:00
Просто нельзя взять и использовать ретёрн тайп напрямую.

Andrei
23.04.2016
08:40:44
Но если делать это как в условном хаскелле, через do нотацию или монадический биндер, то это выглядит совершенно прозрачно.

Roman
23.04.2016
08:40:55
Тогда вот контр-аргумент похода https://isocpp.org/wiki/faq/exceptions#exceptions-avoid-spreading-out-error-logic

Andrei
23.04.2016
08:41:37
Я успел раньше написать ответ на это контраргумент :3

Roman
23.04.2016
08:41:56
И пара ответов ниже в том же факе.

Andrei
23.04.2016
08:42:39

Roman
23.04.2016
08:44:30
Да, Я не пытаюсь кого-то переубедить, мне интересно что вы думаете про intermixing обработки ошибок и основной логики. В моем понимании применение excepted ни чем особо не лучше return codes, кроме композиции в 1 объект

Andrei
23.04.2016
08:45:54
Я про это и написал. Там нет этого смешивания т
Наоборот. У тебя есть возможность написать как раздельную обработку ошибок так и обработку на месте.

Google

Roman
23.04.2016
08:48:20
Ок, попробую поиграться с этим

Andrei
23.04.2016
08:49:02
Дело именно в связывании. Ты можешь связать excepted с двумя функциями с функцией продолжения и функцией фейла
И ты попадешь только в одну из них.
Поэтому в функцию успеха тебе прозрачно приходит нормально распакованное значение.
Единственный минус - это в некотором смысле обоатный порядок записи, но это чисто плюсовая проблема.

Admin
ERROR: S client not available

Andrei
23.04.2016
08:50:37
Другой вариант эмулировать do- нотацию
Когда мы пишем типа

Roman
23.04.2016
08:51:18
А где подробнее почитать , с примерами?

Andrei
23.04.2016
08:51:24
a<-getA
b<-getB
return a+b
Поскольку оператора <- в плюсах нет, можно сделать это хоть макросом.

Roman
23.04.2016
08:52:20
А, ок

Alex Фэils?︙
23.04.2016
08:52:25

Andrei
23.04.2016
08:52:44
< бинарный

Alex Фэils?︙
23.04.2016
08:52:50
ага
А минус будет прокси возврвщать

Andrei
23.04.2016
08:53:17
Но там не очень поможет перегрузка

Alex Фэils?︙
23.04.2016
08:53:17
хотя фу,бд

Andrei
23.04.2016
08:53:38
Эта штука должна уметь делать ретёрн из функции выше по стеку :)

Google

Andrei
23.04.2016
08:54:00
Я представляю как это делается но это темная магия.

Stanislav
23.04.2016
08:55:39
https://github.com/ptal/expected вот реализация пропозала

Andrei
23.04.2016
08:55:56
Не.
Одна из сотен возможных :3
К тому же тащит буст за собой :(
Есть более легковесные реализации на основе только стандартной библиотеки.

Stanislav
23.04.2016
09:05:25
оба автора

Alex Фэils?︙
23.04.2016
09:06:12
Но можно без бустоты сделать

print('hi')
23.04.2016
09:07:29
моё сообщение удалили?

Andrei
23.04.2016
09:08:05
Пока что в буст.
Вс равно все по-своему сделают. PJ Plauger сделает так, коммьюнити libstdc++ сяк.

Stanislav
23.04.2016
09:10:07
эт да
блин на первый вглзяд напоминает то как в го ошибки возвращаются )

Andrei
23.04.2016
09:11:12
Не знаю насчет го, но вот в Rust именно так.