Matwey
Господа, а какой-нибудь сейчас есть прошареный дизасемблер, сделанный из llvm, например, который бы в какой-нибудь более-менее высокоуровневый псевдокод мог привести байткод? Чтобы почитать его мозгами
Matwey
Мне бы математические формулки восстановить
Matwey
Из потрохов функций
🦥Alex Fails
Из ллвм хз, но есть ида и хекс-рейс
Matwey
Да у меня там код состоит из x87 float-point операций, условных переходов. Мне что-нибудь простое подойдет.
ttldtor
типа https://derevenets.com/ ?
ttldtor
А...гм... под линухи standalone нет
Matwey
Типа него, да
Matwey
А там вроде собрать предлагают
Matwey
Из исходников
Stanislav
типа https://derevenets.com/ ?
интересная штука
Olesya
есть вопрос по поводу Eigen::SparseMatrix. матрица размером где-то 800 на 55 тыс. при итеративном присвоении элементов с доступом к ним с помощью сoeffRef при таком размере ужасно нагружается память и ядра. если просто перебирать элементы, то такого не происходит. мб я не так присваиваю?
Olesya
вроде в документации примеры такие же
Olesya
мб также проблема в том, что я при каждом присвоении ресайзю её, так как мне неизвестен изначальный точный размер, но сама операция ресайза такого эффекта не вызывает. именно при присваивании всё становится плохо.
Olesya
вот пример, как я делаю присваивание: matrix.coeffRef(i, j) = (double)tf_it->second / (double)words_in_doc;
Egor
Полагаю, что присвоение элемента, который раньше был нулём — очень дорогая операция, порядка std::set::insert. Если матрица разреженная, то её смысл именно в том, что она не хранит нулевые элементы. Если становится ненулевым — его надо как-то создать, выделить память... Возможно, если заранее известно, какие группы значений будут в матрице, можно как-то заранее выделить под них память.
Olesya
ага, понятно. я думала, мне удобнее будет класть по сформированной строке в матрицу, но видимо, нет.
Egor
Вроде документация пишет, что матрица умеет храниться либо по строкам, либо по столбцам. Возможно, у вас случайно используется не то, что эффективно в конкретном случае.
Egor
Вот, например, есть функция, которая выделяет место под сколько-то элементов в каждом столбце или строчке: https://eigen.tuxfamily.org/dox/classEigen_1_1SparseMatrix.html#ac2b219eb36fbab0bfae535cfbfc74a76
Olesya
спасибо
Berkus
/warn offtopic
Anonymous
начинается
vladislav
начинается
Можешь в чате про работу спросить, там уместенее
Anonymous
а есть такой?
Anonymous
в лс напишу, если чо
vladislav
а есть такой?
pro.cxx.jobs_flood
Anonymous
спс
🦥Alex Fails
Да
Alexander "SonnySlave"
https://www.visualstudio.com/en-us/news/releasenotes/vs2017-relnotes#LibImprov
Anonymous
есть вопрос по поводу Eigen::SparseMatrix. матрица размером где-то 800 на 55 тыс. при итеративном присвоении элементов с доступом к ним с помощью сoeffRef при таком размере ужасно нагружается память и ядра. если просто перебирать элементы, то такого не происходит. мб я не так присваиваю?
coeffReff сначала ищет элемент, потом присваивает элемент. Если заранее известны данные, то имеет смысл создать triplet(i, j, value), потом их вставить в матрицу. Но этот метод подходит только для инициализации матрицы, повторное добавление через triplets обнулит матрицу. Вроде как то так было)
Anonymous
спасибо за рекомендацию. попробую так.
https://eigen.tuxfamily.org/dox/group__TutorialSparse.html в общем тут "Filling sparse matrix" раздел.
🐙 Antony
https://www.visualstudio.com/en-us/news/releasenotes/vs2017-relnotes#LibImprov
О да, круто. Особенно вот это https://docs.microsoft.com/en-us/visualstudio/test/how-to-use-boost-test-for-cpp
Alexander "SonnySlave"
О да, круто. Особенно вот это https://docs.microsoft.com/en-us/visualstudio/test/how-to-use-boost-test-for-cpp
кстати в Clion тоже добавили поддержку. Теперь там вроде поддерживается Boost.Test, gtest, catch
Vitaliy
Подскажите какую-нибудь библиотеку, в которой удобный ассерт есть
Vitaliy
стандартный не пишет сообщения и на мой взгляд бесполезен
🐙 Antony
BOOST_ASSERT
🐙 Antony
+ вот это: http://www.boost.org/doc/libs/master/doc/html/stacktrace/getting_started.html#stacktrace.getting_started.better_asserts
🐙 Antony
да
Vitaliy
Окей, сейчас посмотрю, спасибо
Vitaliy
Ну и ещё вопрос у меня есть. Каким образом обрабатывать невалидные данные в функции ?
Vitaliy
Есть два стула: ассерты, исключения
Vitaliy
Хотя... можно ещё какой-нибудь expected вернуть.
Anatoly
Есть два стула: ассерты, исключения
ассерты для отлова твоих ошибок, exception для отлова ошибок пользователя, который передал невалидные параметры
Vitaliy
Тут наверное зависит от того может ли жить моя программа дальше или нет.
Anatoly
да, и упаси бог писать assert(production_code());
Vitaliy
Почему ?
Egor
Потому что assert какой-нибудь компилятор может вырезать в production-сборке.
Vitaliy
MinGW точно вырезает
Egor
Есть два стула: ассерты, исключения
Тут надо определиться, что происходит после невалидных данных. Если это не должно происходить — то программа аварийно завершается. Возможно, что-то записав в лог. Если это штатная ситуация — то надо обработать, причём так, чтобы вызывающий код про это знал. А точный механизм уже не так важен.
Vitaliy
Вроде и по стандарту он только в дебаге работает
Egor
MinGW точно вырезает
Зависит от сборки, там же их тьма.
Vitaliy
А какие best practices сейчас ? Assert должен всегда ассертить или только в дебаге ? Или опять от задачи зависит ?
Vitaliy
На производительность ещё влияет, как я понимаю
Berkus
assert() это в принципе макрос для дебага
Anonymous
Не подскажите, шо значит этот вызов # define __GLIBC__ -2 ?)
Viacheslav
-2 быть не может.
Viacheslav
__GLIBC__ == 2 просто показывает major version of GNU C library.
Anonymous
Ааа, а в ранних в ранних версиях конпиляторов не могло быть такое оформление?
Constantine
Ну и ещё вопрос у меня есть. Каким образом обрабатывать невалидные данные в функции ?
Зависит от области. У нас - ассерт что внешние данные под конвенцию без проверок (кроме крайних случаев), throw если корректный возврат функции невозможен
Constantine
Для последнего я optional использую.
А если вы пишете optional и запрашивается метод valueCref() который возвращает cref на значение внутри пустого optional?
Viacheslav
Optional не показывает, что именно пошло не так. Он максимум скажет, что результата нет.
Viacheslav
Но это уже срачем пахнет.
Vitaliy
Для этого его сначала надо проверить на has_value
Constantine
Я не имею в виду стандартный optional
Vitaliy
Но это уже срачем пахнет.
Да, согласен. От проекта, от задач всё зависит.
Constantine
Для этого его сначала надо проверить на has_value
Да, вызывающий должен знать, что вызов корректный, так что if (!has_value()) throw bad_user_exception(...);
Constantine
Аналогично, например, попытка запустить detach константного выражения из builder типа функция
Constantine
Вызывающий должен был знать, что is_constant
Matwey
Шикарный декомпилятор
Matwey
__asm__("fld qword [edx+eax*8]"); __asm__("fmul st0, st1"); __asm__("fstp qword [edx+eax*8]"); __asm__("fld qword [ebx+eax*8]"); __asm__("fmul st0, st1"); __asm__("fstp qword [ebx+eax*8]");
Matwey
всё понятно стало!
Egor
Могу перевести:
Egor
fl_reg1 = *(edx + eax * 8);
Evgenii
лол