
Constantine
23.10.2018
14:58:54
std::iterator_traits<Iterator>::difference_type возвращает тайпдеф из Iterator, который является точным типом для operator - (Iterator, Iterator)

Побитый
23.10.2018
15:00:08

Constantine
23.10.2018
15:00:28

Google

Constantine
23.10.2018
15:01:08
IMHO тут немного извращение

Dartware
23.10.2018
15:08:49
Привет, посоветуйте книжки где есть главы про параллельное программирование, ну кроме Уильямса и Джосаттиса, про них я уже вкурсе)

Ilia
23.10.2018
15:12:26

Денис
23.10.2018
16:10:14
Привет ребята, у меня такой вопрос, curl multi хочу запускать поток для отправки в гугл аналитик, но при большом количестве в отладке тормозит сильно, это вопрос именно отладки? Знаю из питона про GIL, а как в плюсах работают потоки? Понятно что это не отдельный процесс, но на сколько затратно создание потока?

Andrew
23.10.2018
16:13:40
Не настолько затратно, чтобы быть сильно заметным при тяжелой работе по сети.

Денис
23.10.2018
16:17:55
Она там не тяжелая, самый мелкий запрос, в цикле 200 отправок запустил и 5 секунд залип

Egor
23.10.2018
16:18:25
главное, чтобы поток не каждый раз при этом создавался

Александр
23.10.2018
16:19:21

Денис
23.10.2018
16:19:51
А как этим можно в curl управлять? Там вроде только метод perfom

Александр
23.10.2018
16:20:44

Денис
23.10.2018
16:21:51

Ilia
23.10.2018
18:15:01

Google

Ilia
23.10.2018
18:16:09

Anatoly
23.10.2018
18:17:39

Дмитрий
23.10.2018
18:18:57
Ну смотря в каком режиме. 10К подключений и потоки уже не такие легкие. А так несложно, да.

Денис
23.10.2018
18:26:19

Anton
23.10.2018
18:26:50

Ilia
23.10.2018
18:26:50

Денис
23.10.2018
18:28:18

Constantine
23.10.2018
18:29:45

Ilia
23.10.2018
18:34:04

Серж
23.10.2018
18:34:13
https://ideone.com/N5qvqS
почему p и other_p в cout выводят одинаковое значение, а при вызове результаты как и ожидается разные?

Александр
23.10.2018
18:36:06

Серж
23.10.2018
18:36:14
1 и 1

Александр
23.10.2018
18:36:35
они вывелись как bool (оба = true)
std::cout << val << std::endl; эквивалентно std::cout << (val != nullptr) << std::endl;

Серж
23.10.2018
18:38:05
а другие указатели почему не как bool выводятся?

Александр
23.10.2018
18:38:42
потому что другие указатели - void*, а эти - указатели на методы
указатель на член не обязан влезать в void* в принципе, не говоря уже о касте к нему

Google

Серж
23.10.2018
18:39:56
понял, спасибо

Kitsu
23.10.2018
18:53:36
https://github.com/hogliux/semimap

Constantine
23.10.2018
18:59:57

Серж
23.10.2018
19:07:35
с указателями на виртуальные функции-члены класса все сложнее:
https://stackoverflow.com/questions/1087600/pointers-to-virtual-member-functions-how-does-it-work
говорят, что еще может быть задействован оффсет в таблице виртуальных методов, и что это не специфицировано и на других компиляторах может быть по другому. Собственно на других компиляторах и самой таблицы виртуальных методов может не быть.

Igor
23.10.2018
19:10:12

Constantine
23.10.2018
19:11:01

Igor
23.10.2018
19:11:21

Constantine
23.10.2018
19:11:30
Если Base::SomeFunction используется как Derived::* то нужно static_cast

Igor
23.10.2018
19:16:36
Аргумента this для функции
Ну видишь, уже сильно сузили от "что указатель на функцию-член класса это ptr + offset" до конкретного случая, и то у MSVC это не так. Все сильно зависит от компилятора.

Constantine
23.10.2018
19:16:51

Igor
23.10.2018
19:17:17
Одно слово, https://gcc.godbolt.org/z/zak6fD

Constantine
23.10.2018
19:17:57

Серж
23.10.2018
19:18:39

Constantine
23.10.2018
19:18:49

Igor
23.10.2018
19:19:27
Это хорошо или плохо?
Это по-другому :) Реализовать можно по-разному, можно например trampoline функции генерировать.

Constantine
23.10.2018
19:20:28

Александр
23.10.2018
19:23:36
Во время реверса видал такое, что указатель на метод занимал честные 4*sizeof(void*)

Constantine
23.10.2018
19:23:47
4?

Google

Александр
23.10.2018
19:23:52
4

Constantine
23.10.2018
19:23:58
зачем еще 2?

Серж
23.10.2018
19:24:37
1 на смещение в таблице виртуальных методов и еще 1 для паддинга, чтобы байтоебы были довольны

Constantine
23.10.2018
19:25:25
а разве смещение в таблице виртуальных не пишется в качестве значения меньше порога?

Серж
23.10.2018
19:26:05
я так понял правильный ответ - имплементейшн дефайнед

Constantine
23.10.2018
19:26:10
это понятно

Александр
23.10.2018
19:26:20
1) адрес метода
2) смещение this
3) 4) были всегда нулями (сорцов не было), но видимо относились как раз-таки к виртуальному наследованию

Constantine
23.10.2018
19:26:23
вопрос в том, что обычно есть основной имплементейшн
виртуальное наследование... хм...

Александр
23.10.2018
19:27:17
кажется, это был вижак 6-й или около того

Constantine
23.10.2018
19:27:17
там же static_cast это виртуальный вызов)
вот я прямо хочу опрос, пользовался ли кто-нибудь виртуальным наследованием!

Александр
23.10.2018
19:35:04
Не пользовался, поэтому никак не запомню правила его работы

Ignat
23.10.2018
19:36:38
Я тут не первый раз замечаю, что у gdb и lldb иногда получаются разные бэктрейсы. Разве при раскрутке стека есть вообще какие-либо степени свободы?

Constantine
23.10.2018
19:37:28

Igor
23.10.2018
19:38:22

Constantine
23.10.2018
19:39:42
Там кто-то должен static_cast сделать, но я не знаю, кто

Igor
23.10.2018
19:41:03
Вроде не должно быть ковариантности в return типе у указателей на функцию.
У std::function зато вроде была.

Google

Constantine
23.10.2018
19:41:36
std::function вообще разрешает что угодно
у меня прямо коммент в коде есть
//bunch of trolls
// std::function<void()> lambda = [&] () { return lambda; }; //OK!!!!

Александр
23.10.2018
19:45:11

Constantine
23.10.2018
19:45:35
Ну а почему бы и нет
Я тогда сгорел, у меня там два тайпкаста прошло (ATL::CString -> LPCTSTR -> ATL::CString)

Александр
23.10.2018
19:46:03
А подробнее?

Constantine
23.10.2018
19:46:47
std::function<CString(CString)> f = [&] (CString s) {
return (s == L"") ? L"" : s;
};
у CString-а разрешен implicit cast в LPCTSTR

Александр
23.10.2018
19:48:05
Ах это, помню

Constantine
23.10.2018
19:48:14
угу
я сгорел и поставил проверки на обертывание на запрет кастов возвращаемого типа

yuri
24.10.2018
04:28:51
А как этим можно в curl управлять? Там вроде только метод perfom
Curl multi + perform конечно притормозит выполнение, пока все таски не завершатся. Иначе делается через события на сокетах: через curl_multi_fdset - extracts file descriptors from multi handle, этот fdset скармливаешь в select()/WaitForMultipleObjects, по выходу вызываешь соответствующие curl_multi_socket_action. Тогда главный поток остается под твоим контролем.
Я пробовал в одном своем pet-project, сейчас деталей не помню.

Ioann V
24.10.2018
04:39:30
Те методы что предлагает курл, не моментальны

yuri
24.10.2018
04:44:08
Те методы что предлагает курл, не моментальны
Либо а) perform в новом потоке — можешь терминировать поток, либо б) работа с сокетами и select() в основном потоке — тогда в асинхронном режиме тормозов не должно быть. Еще можно curl_easy + WRITEFUNCTION callback. Тогда можно будет прерывать передачу в этом коллбэке.

Ioann V
24.10.2018
04:44:42