@ProCxx

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

Побитый
23.10.2018
15:00:08
Но ведь value_type это decltype для *Iterator а difference_type для Iterator - Iterator
https://en.cppreference.com/w/cpp/iterator/iterator_traits по ссылке ничего про это нет. Там прямые алиасы

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

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

Денис
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
Google
Дмитрий
23.10.2018
18:18:57
Ну смотря в каком режиме. 10К подключений и потоки уже не такие легкие. А так несложно, да.

Денис
23.10.2018
18:26:19
Мне кажется тебе в другой чат надо, в чат по русскому языку...
Еще у меня есть физиологические недостатки, мне с ними куда?

Ilia
23.10.2018
18:26:50
Еще у меня есть физиологические недостатки, мне с ними куда?
Да ладно. Просто писать яснее надо что надо.

Затратно. Отсюда тредпулы (хотя по большей части для контроля за ресурсами)
Толь, по сравнению с созданием процесса это вообще пшик.

Денис
23.10.2018
18:28:18
Да ладно. Просто писать яснее надо что надо.
Я когда смогу ясно спросить я у гугла спрошу, но пока гугл не научился настолько понимать слабосвязанную речь новичков лучше чем человек - я пишу в чат, извините потерпите

В js-чат?
У психиатров уже был

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: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
указатель на член не обязан влезать в void* в принципе, не говоря уже о касте к нему
я вот недавно прифигел что указатель на функцию-член класса это ptr + offset

Серж
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
я вот недавно прифигел что указатель на функцию-член класса это ptr + offset
Расскажи в каких случаях это ptr+offset и куда ptr указывает?

Constantine
23.10.2018
19:11:01
Расскажи в каких случаях это ptr+offset и куда ptr указывает?
Видимо, всегда, ptr как всегда на функцию, а offset чтобы правильно static_cast сделать

Constantine
23.10.2018
19:11:30
static_cast кого во что?
Аргумента this для функции

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

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

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

Constantine
23.10.2018
19:17:57
Одно слово, https://gcc.godbolt.org/z/zak6fD
Виртуальные отдельно, лучше без них смотреть

Серж
23.10.2018
19:18:39
Одно слово, https://gcc.godbolt.org/z/zak6fD
Это хорошо или плохо?

Constantine
23.10.2018
19:18:49
Одно слово, https://gcc.godbolt.org/z/zak6fD
Они проверяют, возможно ли ненулевое смещение, похоже

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

Constantine
23.10.2018
19:20:28
Это по-другому :) Реализовать можно по-разному, можно например trampoline функции генерировать.
там вижак пропустил Base1* Base2::f() которая оверайднута на Derived1* Derived2::f() в качестве Base1* Derived2::*

Александр
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
Не пользовался, поэтому никак не запомню правила его работы
Ну я тоже не пользовался, но это выглядит как виртуальный static_cast

Igor
23.10.2018
19:38:22
https://godbolt.org/z/UXmAp7 Вот это интересно хорошо или плохо)
Видимо причины примерно одинаковые с моим примером :)

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!!!!

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, сейчас деталей не помню.

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

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