@ProCxx

Страница 1238 из 2477
Berkus
24.08.2017
18:13:12
ну и как ты думаешь, нужны нам все 500к строк? или работающего примера хватит?

Constantine
24.08.2017
18:13:18
сделает хуевый велосипед и успокоится
ну да, лучшее предложение вместо бросания исключения возвращать обертку с исключением

Google
Alexander
24.08.2017
18:13:36
это в if ищется дольше

Andrei
24.08.2017
18:13:57
там же строится jump table
Какая разница? Условия-то надо всё равно все перебрать.

В худшем случае.

Azoyan
24.08.2017
18:14:14
это в if ищется дольше
Я читал про это, но решил проверить

Constantine
24.08.2017
18:14:20
там не исключение если что
А что там? В чем принципиальная разница между "функция вернет значение или бросит исключение" и "функция вернет сложный объект как значение"?

Berkus
24.08.2017
18:14:35
cmp eax, 91 je .L3 cmp eax, 91 jg .L4 cmp eax, -1 je .L5 cmp eax, 3 je .L6 jmp .L2 вот твой свитч - иф-джамп-иф-джамп

Azoyan
24.08.2017
18:14:58
То есть О(N)?

Alexander
24.08.2017
18:15:03
Какая разница? Условия-то надо всё равно все перебрать.
так, внимание вопрос: а зачем тогда switch нужен?

Andrei
24.08.2017
18:15:03
Да.

Kostya
24.08.2017
18:15:06
Какая разница? Условия-то надо всё равно все перебрать.
нет, немного не так как в ифах, свитч быстрей (как асемблерщик говорю)

Berkus
24.08.2017
18:15:36
cmp eax, -1 je .L5 cmp eax, 3 je .L6 jmp .L2 .L4: cmp eax, 69199 je .L7 cmp eax, 1255125 je .L8 jmp .L2 он еще смешно поделил пополам по значению 91

Andrei
24.08.2017
18:15:42
так, внимание вопрос: а зачем тогда switch нужен?
Низачем. Это просто конструкция языка. Все равно будет n проверок для n-ного кейса.

Google
Azoyan
24.08.2017
18:15:48
Может он как хеш таблица работает?

Azoyan
24.08.2017
18:15:56
Тогда О(1)

Andrei
24.08.2017
18:16:13
нет, немного не так как в ифах, свитч быстрей (как асемблерщик говорю)
Конечно не так, но вопрос-то был про асимптотику.

Berkus
24.08.2017
18:16:13
зависит от компилятора :D
ну естественно, и от опций компиляции

Constantine
24.08.2017
18:16:15
O(log N) показывает Беркус

Alexander
24.08.2017
18:16:18
что-то я раньше читал, что switch шустрее должне быть. Но за ассемблер не могу ничего сказать

Azoyan
24.08.2017
18:16:42
Я всегда проверяю -О0

Berkus
24.08.2017
18:16:45
O(log N) показывает Беркус
да, близко к тому

Constantine
24.08.2017
18:16:47
ну очевидно что компилятор пока строит дерево поиска

Andrei
24.08.2017
18:16:49
O(log N) показывает Беркус
Это легко ломается же.

Constantine
24.08.2017
18:17:07
видимо, для 100 значений он будет вычислять переход, но это не точно

Andrei
24.08.2017
18:17:12
Сделайте порядок в switch-e другой и break уберите.

Alexander
24.08.2017
18:17:14
Я всегда проверяю -О0
а зачем ты так делаешь?))

Andrei
24.08.2017
18:17:33
И ему ничего не останется как сделать честные O(n) проверок.

Azoyan
24.08.2017
18:17:58
Berkus
24.08.2017
18:18:06
cmp esi, 91 je .L3 jg .L4 -Ofast сделал немного peephole оптимизаций убрав релоады

Kostya
24.08.2017
18:18:07
что-то я раньше читал, что switch шустрее должне быть. Но за ассемблер не могу ничего сказать
зависит от компилятора(и флагов как подсказали). jump table быстрей чем if, но если просто сравнение - то тоже самое по сути

Alexander
24.08.2017
18:18:10
https://stackoverflow.com/questions/1837656/jump-table-switch-case-question

Google
Berkus
24.08.2017
18:18:11
но в целом история та же

Andrei
24.08.2017
18:18:23
Логарифм там только для break в каждом кейсе. Тогда действительно, поскольку свитч только для целых на которых есть сравнение.

Constantine
24.08.2017
18:18:30
Кстати, Беркус, а как в случае возврата Result<T, Error> глобально переопределить действие при ошибке?

Berkus
24.08.2017
18:18:53
Constantine
24.08.2017
18:18:54
Ты же полностью на клиента перекладываешь заботу об ошибке

Andrei
24.08.2017
18:19:07
Jump table не то чтобы обязательно быстрее. Поход в память штука дорогая.

Azoyan
24.08.2017
18:19:23
Я проверял на ICC, clang, GCC они без оптимизаций примерно одинаковый код дают

Andrei
24.08.2017
18:19:28
Сравнение работает быстрее.

Berkus
24.08.2017
18:19:57
.unwrap() => { if (err) handler(); return T; } handler() = panic();

Kostya
24.08.2017
18:20:01
Constantine
24.08.2017
18:20:03
глобально задавай handler для unwrap()
template <...> global_unwrap_handler()

Matwey
24.08.2017
18:20:06
глобально задавай handler для unwrap()
Это теперь чат про rust?

Berkus
24.08.2017
18:20:22
Это теперь чат про rust?
нет, перетаскиваем best practices

Azoyan
24.08.2017
18:20:27
Короче, скажите да. Switch в худшем случае работает за О(N)

Andrei
24.08.2017
18:20:59
Да.

Constantine
24.08.2017
18:21:12
Я не спорю что вся механика Result<> очень хороша при наличии do-нотации и если надо заставлять проверять ошибки, это просто совершенно не тот случай

Здесь скорее нужен variant<enum, callback> как параметр

Berkus
24.08.2017
18:21:48
ну оно и без do-нотации зачудительно работает

Matwey
24.08.2017
18:21:59
нет, перетаскиваем best practices
А паттерн матчинг уже завезли в C++?

Google
Berkus
24.08.2017
18:22:08
Vladislav
24.08.2017
18:22:13
очень частично

Alexander
24.08.2017
18:22:18
А паттерн матчинг уже завезли в C++?
да-да, уже есть. Вместе с рефлексией можешь юзать

Matwey
24.08.2017
18:22:23
да, конечно
Это мне по нраву

Berkus
24.08.2017
18:22:37
Alexander
24.08.2017
18:22:50
#import <pattern_matching>

Berkus
24.08.2017
18:23:14
#import <pattern_matching>
в примерах написано #include <mpark/match.hpp>

Alexander
24.08.2017
18:23:44
в примерах написано #include <mpark/match.hpp>
дык это левый какой-то паттерн-матчинг. Я тебе говорю про стандартный ?

Berkus
24.08.2017
18:23:58
так тебе шашечки или ехать?

Evgeniy
24.08.2017
18:25:44
#import <pattern_matching>
должно быть в модуле

Admin
ERROR: S client not available

Matwey
24.08.2017
18:26:25
#import <pattern_matching>
И модули уже завезли? Я просто был в спячке тут долгое время

Alexander
24.08.2017
18:27:05
Nik
24.08.2017
18:28:54
Вопрос: У меня есть кастомное исключение, которое принимает кастомный enum class ErrorCode, хранит в себе unordered_map<ErrorCode, string/*Строка с описанием проблемы*/>. При вызове what() возвращаеься строка с описанием соответствующей проблемы.

Теперь мне нужно чтобы в строке было еще и текущее состояние объекта. Ну там, типа "Network interface" + networkInterface.to_string() + is not supported";

А передавать обычный эксепшн со строкой вызывает дублирование кода. Ну, эксепшн с одной и той же портянкострокой проблемы пришлось бы вызывать в 15 местах и все такое

Думаю просто хранить объект эксепшена в классе из которого я его буду кидать, чтобы эксепшн знал о внутреннем состоянии класса

А, вопрос

Google
Nik
24.08.2017
18:33:52
Почему я так ублюдочно это все делаю и как лучше?

Alexander
24.08.2017
18:34:46
конструируй исключение с нужной тебе инфой

а потом внутри what() выводи в нужном тебе виде

Nik
24.08.2017
18:39:30
Просто тогда я во многих местах буду дублировать код, пишучи throw myException("Описание проблемы на 100500 строк" + currentValue1 + "Еще 100500 строк" + currentValue2); И я бы хотел чтобы логика конструирования строки была внутри самого what() Плюс мне надо в эксепшене хранить ретурнкод с которым программа должна завершиться

А он как раз определяет какое сообщение об ошибке

Alexander
24.08.2017
18:40:01
а вспомогательную передавай. Потом скомбинируй в нужном порядке внутри what()

или тебе такое тоже не нравится?

ты понял, что я тебе предлагаю?

Nik
24.08.2017
18:42:38
Да, допер

Спс

Alexander
24.08.2017
18:43:56
Constantine
24.08.2017
19:52:59
хм... а что если я буду вместо коллбека передавать что-то такое template <typename DefaultOptionsType, /*сигнатура функции*/> struct customizable_dispatcher { //конструкторы в стиле variant<DefaultOptionsType, function</*сигнатура функции*/>> /*возврат из сигнатуры функции*/ operator ()(function</*сигнатура функции плюс параметр DefaultOption*/> defaultCallback, /*параметры из сигнатуры функции*/){ //проверить variant и либо вызвать функцию, либо defaultCallback с соответствующей опцией } };

хм... наверное даже не function(/**/) а просто указатель на функцию, потому что параметров принципиально должно быть достаточно

Alexander
24.08.2017
19:59:46
Делай так, чтобы было неважно, что пользователь передаст: функцию, функтор, лямбду или std::function

тебя же только волнует, чтобы у этой сущности был ()

Constantine
24.08.2017
20:00:20
Вроде как в 99% случаев создание объекта потеря времени

Речь о поведении при ошибке по умолчанию, user-defined option разумеется <s>всегда лямбда</s> function

Alexander
24.08.2017
20:01:02
Вроде как в 99% случаев создание объекта потеря времени
это уже пользователю функции решать

Constantine
24.08.2017
20:02:34
что за велосипед на этот раз я изобрел?)

Alexander
24.08.2017
20:03:52
я не понимаю, почему ты не можешь в функцию передать просто грёбаный колбэк, который ты внутри уже сам будешь решать, когда вызывать

Constantine
24.08.2017
20:04:15
потому что в этом случае я не смогу написать унифицированную версию throw_exception

Страница 1238 из 2477