Aidar
нужно сделать тип типа variant
Aidar
и его хранить
Igor
?
Aidar
потомучто иначе передача не того компаратора это потенциальное место для багов
🐙 Antony
Приветствую! Небольшой вопрос по поводу nothrow версии оператора new. В стандарте внутри хедера new присутствует такое определение struct nothrow_t {}; extern const nothrow_t nothrow; Как так получилось что nothrow имеет extern linkage? Это из-за совместимости сделано было? Вот отсюда не очень понятно почему https://stackoverflow.com/questions/13506234/what-is-the-use-of-stdnothrow-and-stdnew-handler-in-standard-header-file-ne Отсюда вопрос что делать если я хочу компилить с -nostdlib? Корректно ли добавить эту константу самому: //clang++ -std=c++14 -fno-exceptions -nostdlib -lc main.cpp #include <cstdio> #include <cstdlib> #include <new> #include <memory> const std::nothrow_t mynothrow; class foo { public: void* operator new(std::size_t count, const std::nothrow_t& tag) { std::printf("global op new called, size = %zu\n", count); return std::malloc(count); } void operator delete(void* ptr) noexcept { std::puts("global op delete called"); std::free(ptr); } }; int main(){ auto f = new (mynothrow) foo; } И еще обратил внимание на то, что у std::make_unique нет специализации для nothrow версии new. int main(){ auto f = std::make_unique<foo>(); // does not compile }
Добавлять самому можно. Вообще кажется, что надо заменить в стандарте на inline constexpr, тогда пропадёт такая проблема в принципе (символ все равно будет external visibility, но линкер будет барть первую попавшийся инстанс а остальные считать дубликатами). А внешняя видимость необходима для того, чтобы избежать нарушений odr. Закиньте предложение на stdcpp.ru по поводу делания nothrow как inline constexpr (чтобы не потерялось). Я оформлю в виде дефекта к стандартной библиотеке
Aidar
надо custom_less<Types...>
Aidar
is_transparent тоже определить
Aidar
или может set<comparable_with<Type, string>, std::less<>>
🐙 Antony
не справляется всё из-за того бага с оптимизацией контейнеров с динамической аллокацией?
Ещё не настал тот час, когда компиляторы влёгкую это делают. Придётся ждать ещё пяток лет. Там будут constexpr контейнеры, и компиляторы будут вынуждены это уметь оптимизировать.
Anonymous
Пытаюсь собрать модуль для python на C++ При компиляции появляется ошибка /usr/include/boost/python/detail/wrap_python.hpp:50:11: fatal error: pyconfig.h: Нет такого файла или каталога # include <pyconfig.h> ^~~~~~~~~~~~ compilation terminated. CMakeFiles/API.dir/build.make:86: recipe for target 'CMakeFiles/API.dir/Backend.cpp.o' failed
Anonymous
Версия python - 3.6.5
Anonymous
Сам файл pyconfig.h есть и лежит в директории /usr/include/python3.6/pyconfig.h
Anonymous
Ты путь к нему прописал в смейке?
Нет. А как это сделать?
Ostap ꑭ
include_directory("/usr/include/python3.6/")
Anonymous
include_directory("/usr/include/python3.6/")
Unknown CMake command "include_directory"
Ostap ꑭ
Ой
Ostap ꑭ
include_directories
Anonymous
Как добавить флаги -lboost_python -lboost_system ?
Sergey
target_link_libraries
Anonymous
target_link_libraries
Cannot specify link libraries for target "boost_python" which is not built by this project.
Anonymous
Странно, не может найти boost python
Anonymous
target_link_libraries("boost_python", "boost_system")
Aidar
юзай find boost какойнибудь
Aidar
эм
Aidar
ты таргетом указал буст пайтон
Aidar
а таргет это твой таргет
🐙 Antony
Странно, не может найти boost python
Рекомендую делать как-то вот так https://github.com/apolukhin/dmn/blob/master/CMakeLists.txt#L24
Anonymous
Boost version: 1.65.1 -- Found the following Boost libraries: -- filesystem -- thread -- unit_test_framework -- system -- graph -- regex -- python -- chrono -- date_time -- atomic CMake Error at CMakeLists.txt:4 (target_link_libraries): Cannot specify link libraries for target "boost_python," which is not built by this project.
Anonymous
Короче, я переписываю Cheat Engine на линукс, потому что потому, так вот, у меня проблемес. Вот я сделал снепшот процесса, теперь задача найти значения. У меня это получилось, но CE использует многопоточность. Собсна я немного затупил: я должен сделать mmap этого снепшот-файла, далее создать 8 потоков, для каждого потока свой оффсет этого mmap и свой файл для записи. И вопрос: ничего страшного не будет, если mmap будет читаться не последовательно, как при одном потоке, а перепрыгивая c 0 оффсета файла на snapshot.size()/8*1, в третьем потоке с snapshot.size()/8*2 и тд... Или же что-то другое сделать? Типа читаю первые 8 единиц информации, каждую из них фижу в потоки (что бы не было никаких задержек, например, у пользователей с HDD)
Anonymous
Тупо скажите что гуглить. Thread pool это и есть то, что я хочу? Или ограничиться массивом из 8 потоков?
Vitaly
А у тебя этот снепшот на диск пишется? Или в оперативе лежит? Если в оперативе, то лучше первый вариант. И тред пул тут не нужен по идее, если ты хочешь сначала обработать на разных потоках а потом резы в одном выводить
Aidar
тогда я не понял причем тут хдд
Vladislav
тогда я не понял причем тут хдд
в хдд что-то там пишется
Vitaly
Не понятно куда снапшот сохраняется
Aidar
ну короче если он работает с хдд у него лагает изза хдд
Aidar
и потоки не помогут
Vitaly
mmap вроде должен замапленный файл в рам загружать
Vitaly
хотя бы часть, к которой чтение идёт
Vitaly
Ну, ленивое то есть?
Vitaly
А какой размер снапшота, примерно?
Anonymous
Обычно от 1 до 5 гб, в зависимости от игры/приложения
Vitaly
можно кароче делить не на количество потоков, а на размер страниц и ассинхронно страницы обрабатывать
Aidar
на количество*
Aidar
делай количество потоков равным hardware_concurency зачем больше
Vitaly
+
Aidar
и мапай настолько большими кусками насколько возможно
Aidar
причем ты должен знать размер куска
Anonymous
Короче, я планирую тупо 4 МБ на поток, следовательно читаю в буфер 4*hardware_concurency МБ, далее в каждый поток как-то фижу этот буфер. Но как?
Anonymous
Я не знаю, как реализовать это, я в мультипоточности новичок
Aidar
юзай std::async тогда
Vitaly
тебе на си?
Aidar
там все просто
Vitaly
гугли про семафор, он тут как раз нужен
Aidar
да вроде не нужно ничего
Vitaly
а, ну да, асинком лучше
Anonymous
Aidar
это совершенно точно не конкурентная задача, конкуренция тут только за пейджинг
Dmitry
Приветствую! Пытаюсь осмыслить перегрузки для delete из п.17.6.4.6 Определил nothrow перегрузку для new и ожидаю(верно ли?), что надо бы определить такую же перегрузку для delete. Но получил ошибку компиляции: test.cpp:21:5: error: no suitable member 'operator delete' in 'Foo' delete f1; ^ test.cpp:11:10: note: member 'operator delete' declared here void operator delete(void *pVoid, const std::nothrow_t &tag) { #include <new> #include <memory> class Foo { int m; public: void *operator new(std::size_t sz, const std::nothrow_t &tag) { return std::malloc(sz); } // nothrow new fails to link with this delete void operator delete(void *pVoid, const std::nothrow_t &tag) { std::free(pVoid); } // works with this one // void operator delete(void *pVoid) { // std::free(pVoid); // } }; int main(){ auto f1 = new (std::nothrow_t{}) Foo; delete f1; //delete (std::nothrow_t{}) f1; // syntactically incorrect? }
Anonymous
delete вызывает деконструктор же, не?
Dmitry
да
Dmitry
понятно, что он не кидает исключений, но зачем тогда перегрузка с std::nothrow_t параметром
Aidar
понятно, что он не кидает исключений, но зачем тогда перегрузка с std::nothrow_t параметром
Called by the non-throwing single-object new-expressions if a constructor of the object throws an exception.
Aidar
они поидее все не должны ничего бросать вроде
Dmitry
может компилятор не ту версию берет
Aidar
он берет ту которая без nothrow
Dmitry
использовал clang version 5.0.1 (tags/RELEASE_501/final)
Dmitry
Видимо Вы меня не правильно поняли: все delete помечены как noexcept ( смотрите тут https://github.com/llvm-mirror/libcxx/blob/master/src/new.cpp ), с выбором конкретной перегрузки проблема
Aidar
вы не можете флажками в new делать разное поведение
Aidar
и delete
Aidar
принципиально
Aidar
потомучто delete nothrow вызывается как там написано при падении конструктора в new nothrow
Aidar
и delete с тегом при падении конструктора в new с тегом