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

Constantine
24.08.2017
18:13:18

Alexander
24.08.2017
18:13:25

Berkus
24.08.2017
18:13:32

Google

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

Andrei
24.08.2017
18:13:57
В худшем случае.

Azoyan
24.08.2017
18:14:14

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

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

Kostya
24.08.2017
18:15:42

Google

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

Constantine
24.08.2017
18:15:51

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

Andrei
24.08.2017
18:16:13

Berkus
24.08.2017
18:16:13

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

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

Andrei
24.08.2017
18:16:49

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

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

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 они без оптимизаций примерно одинаковый код дают

Berkus
24.08.2017
18:19:24

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

Matwey
24.08.2017
18:20:06

Berkus
24.08.2017
18:20:22

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

Google

Berkus
24.08.2017
18:22:08

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

Alexander
24.08.2017
18:22:18

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

Alexander
24.08.2017
18:23:44

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

Evgeniy
24.08.2017
18:25:44

Admin
ERROR: S client not available

Matwey
24.08.2017
18:26:25

Alexander
24.08.2017
18:27:05

Azoyan
24.08.2017
18:27:10
))

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

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

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

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