Это копия, сохраненная 4 октября 2019 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Ответы на все вопросы - http://en.cppreference.com/w/ http://www.cplusplus.com/reference/
Прошлый >>1437014 (OP)
может кто-нибудь устанавливал на линукс gRPC и protobuf? Я не могу разобраться с установкой. Вот так я устанавливаю gRPC https://pastebin.com/GmhTNf7M
потом я устанавливаю protobuf тоже по инструкции.
Но когда я пытаюсь скомпилировать пример из gRPC из examples, мне выдает ошибку будто у меня нет grpc_cpp_plugin. Я гуглил эту ошибку, и оказалось, что этот плагин должен лежать в папке usr/local/bin. Но там его не оказалось, а этот файл лежал в grpc/bins/opt вместе с плагинами для других языков. Но разве после sudo make install этот файл не должен был переместиться в usr/local/bin? Если я вручную копирую grpc_cpp_plugin в usr/local/bin, то эта ошибка больше не выскакивает, и теперь make не может найти ещё какой-то gRPC файл. Ещё я нашел что проблемы могут быть из-за разных версий protoc. Подскажите, как узнать, сколько у меня версий protoc? И мне кажется, наверное после сборки все файлы плагинов должны были сами переместиться в правильную папку? Я не знаю толком cmake, посмотрите пожалуйста мои команды установки. Может там ещё что-то нужно было сделать. чтобы все файлы установились в правильные папки?
2. Если я группирую элементы по 16 байт и считаю расстояния через sse, получается где-то в 2.5 раза быстрее. И если группирую по 32 байта и считаю черезе avx, то получается такая же разница в 2.5 раза.
Это нормально? Просто в процессоре заглушуку поставили, которая два раза по очереди использует sse-функцию?
Любопытно, что _mm_sqrt_pd более чем в два раза опережает sqrt обычный.
То есть я создаю фиктивный __m128d, куда записываю один double через _mm_set1_pd, считаю корень через sse инструкцию и получается немного быстрее чем стандартный sqrt, при том что я полностью игнорирую второе число.
>1
Ох, я открыл cmath, и там внутри вот это. Зачем это всё? Там же только дополнительные вычислительные ошибки накопятся, разве нет? Это же не целые числа, чтобы с переполнением бороться.
Бампану, а то студия заебала сбрасывать настройки после очередного вылета
Знаю что ннадо использовать constexpr, но туплю немношк.
Массив у меня будет чалиться во флеш памяти, потому он должон быть static const, к тому же он обязан быть глобальным ради прерываний. Вобщем нихуя не компилится у меня. Чо делоть то?
constexpr ststic const uint16_t sin_array[SIN_ARRAY_MAX] ={0};
constexpr void fill_sin_array (void) {
for (int i =0; i==SIN_ARRAY_MAX; ++i) sin_array = 0xffff std::sin(180 / M_PI i);
}
void manya () { consexpr fill_sin_array ();
Конечно. Без них там разница раз в шесть получается. O3/O2 одинаково работают. При O3 там по умолчанию ещё какая-то автовекторизация есть которую неплохо бы отключить для частоты эксперимента, "-ftree-vectorize", но я не знаю как её отключать, если я её не указывал и она сама.
>>56708
У меня не msvc.
>>56712
Можешь попробовать так: https://ideone.com/XzSyzP
Но sin - не constexpr, придётся искать кастомную реализацию sin, лол.
>>56717
>Но sin - не constexpr
Да ёб страуструпа мать. Идея как обычно хорошая, а реализация через хуй. Похуй, ебану прощще таблицу в файл.
Наверно ньюфаги всех тут уже заебали, но всё же спрошу.
А если есть знания матана (по крайней мере понимаю о чём речь идёт), из-за специализации в вузике, но на плюсы в моей 600к деревне ищит только одна контора, то как качать скилл?
Сейчас погрузился в глубины формнного индуского ада на wso2, однако всё же хочется перебратся на плюсы.
Есть идея влится в какой нибудь опен соурс, но вот не знаю какой.
В машоб, очевидно же. Во все эти opencv, там матан будет.
Стало интересно, нагуглил это
https://rextester.com/CRR35028
Там какразтыке "кастомный синус" (я помню, что это была лаба в вузике). Выглядит годно, мне понравилось.
Через ряд отвратительная точность будет, синус даже не непрерывный получается, если его нужно для каких-то производных или ещё чего использовать, если что. И суммировать нужно начиная с высших степеней, хотя бы уж, что впрочем тоже не помогает.
https://github.com/gcc-mirror/gcc/blob/master/libquadmath/math/sinq.c
https://github.com/gcc-mirror/gcc/blob/master/libquadmath/math/sinq_kernel.c
Вот этот синус непрерывный. Не знаю что там с точностью, но он по крайне мере гладкий и непрерывный с кучей своих производных. Не вникал в алгоритм, но вроде бы там таблица+ряд.
Ну для 16-битных уж точно проще использовать таблицу, чем констъэксприть такое чудовище.
Есть, короч, кусок Си-шного кода. Могу ли я его скомпилировать C++ -компилятором?
Там вот эти циферки 16 и 1 - время выполнения некой функции test(); Как так получается, что скомпилированное с помощью gcc в 16 раз медленнее скомпилированного с помощью g++?
>вроде он расширение подглядывает при компиле.
Вроде не должен.
Про время хз, а про расширение что-то было, но возможно еще на 4й версии, вроде ошибок насыпало, если расширение и майн его не устраивали.
>скомпилированное с помощью gcc в 16 раз медленнее скомпилированного с помощью g++
М.б. г++ с О2 посчитал сам и выпилил всё, кроме вывода ответа. Проверь без О2.
Практически всегда - да, но есть исключения
Я понял. Функция test(); ничего не выводит и не возвращает и g++ ее за ненадобностью не компилирует.
std::thread
Бамп. Где брать задачки? У липпмана в книге нихуя нет
для asio надо курить бустовую документацию, там все сложно. Для обычной многопоточки - книга товарища Вильямса
Я читал msdn, выделил по моему мнению нужные функции, но в разных примерах пишут по разному. Где то используют регионы, а где то нет. Поэтому и спрашиваю
Ты проверял, меняется что-то для g++, если сделать .cpp расширение?
А ты в объектный код смотрел, там в самом деле нет функции test() или предположил? Мне действительно интересно, настолько ли умный компилятор.
шо ж ты за извращенец, GCC на винде?
>меняется что-то для g++, если сделать .cpp расширение
Не думаю.
>А ты в объектный код смотрел, там в самом деле нет функции test() или предположил? Мне действительно интересно, настолько ли умный компилятор.
g++
Там в тесте rand вызывается. Так что test() таки существует и все rand() честно вызывает.
Если поставить заглушку вместо rand, то
test оптимизируется до ret и не вызывается.
gcc, однако, гораздо менее агрессивен.
От test мало того, что что-то остаётся, так ещё и в main инлайнится. Не ожидал
чекал тутъ https://godbolt.org/
мимо в кресты и асм не умею, не бейте
Если через ReadProcessMemory - вроде похуй, он сделает все проверки за тебя и просто пошлет тебя, если полезешь в пустоту.
Ну.. хуй знает? Я не встречал например. Мож им удобней так, чтоб лишнее не сношать и не терять время. Или начитались того, где сказано так делать.
Спасибо
VirtualAlloc((LPVOID)1000, 5000, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READ);
int a = (int)1500;
cout << *a;
Совсем ультрадебил?
Аллок только пытается выделить память где указано, но если это указывает дебил - то может и в другом месте, он тебе возвращает адрес где выделил.
Че за хуйня. В браузере не работает, а с dashchan'а все ок
[code]
LPVOID M = VirtualAlloc((LPVOID)1000, 4096, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
[/code]
M ссылается на ноль
Хотя в дебаггере функция что то возвращает
If the function fails, the return value is NULL. To get extended error information, call GetLastError.
Там хуйня какаято. Выдает просто огромнейшее шестнадцатиричное число. Такого кода тупо нет
Мож покажешь?
Делал. Ща покажу. извиняюсь за то, что я туплю. Я сегодня вообще думал мозгами отдохнуть и поэтому не напрягаясь пишу и читаю
СУКА. Я не то выводил. Походу надо заканчивать на сегодня. А то толку нет
Бамп же.
как тебе что-то может нравится, если ты даже скомпилировать хелло ворлд не можешь?
Всё могу, в clion встроена консолька, а когда понадобилось запустить программу отдельно я соснул
Я думаю я понял. Так мы сразу проверяем регион на доступность и если он недоступен, значит программа его не использует и мы можем пропустить его.
Зависит от задачи же, если тебе просто почитать по известным адресам - ReadProcessMemory, если делаешь велосипед с поиском значений в памяти - то да, лучше проверить куда лезешь, чтоб быстрее было.
> Если делаешь велосипед
This. Я не могу сообразить как карасик в данном случае может быть быстрее тупо сканирования по байтам. Мне же сначала нужно построить бор, сканируя память, а потом искать. Если бы мне нужно было один раз построить и потом искать то согласен, быстрее. Но мне кажется будет лучше сразу сканировать в поиске нужного значения
Надо с него достать ошибку.
Я не помню точно код, но на стэковерфлроу был вопрос с хорошей самописной функцией для расшифровки.
set_target_properties(prjname PROPERTIES LINK_FLAGS "-pthread -static-libgcc -static-libstdc++")
Ругается на pthread, без него компилится, ошибок не выдает при запуске, но сразу закрывается, как при открытии из проводника так и из консоли.
> Ну это для пингвина/мингв либа.
У меня мингв и стоит
И как я уже говорил, в code::blocks этот же код нормально компилиится а программа запускается и работает.
Еще попробовал скомпилить через консоль, но винда пишет что g++ нет, хотя MinGW лежит в корневом разделе диска
Наркоман чтоль? Либо запусти батник у мингв, либо сам в PATH окружения пропиши его папку, как сделано в батнике.
Запустил, один хуй все сразу закрывается, пиздец какой то. Неужели придется на code blocks сидеть или студию ставить
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static-libstdc++ -static-libgcc")
Как вообще разобраться в работе компиляции и всего этого? Учебник не затрагивает эту тему
В тех когда память защищена ос или еще чем чтобы всякие кулхацкеры не лазили.
Все. Разобрался почти. Не надо отвечать
Подключись дебагерром
>один хуй все сразу закрывается, пиздец какой то
Может быть там просто программы выполняется полностью и закрывается и нужно что-то вроде system("pause") прописать?
Запусти cmd, и внутри cmd пропиши путь к твоей программе. Тогда в консолке останется вывод твоей программы. В программе выводи числа, printf("1\n") - printf("16\n"), таким образом определишь в какой момент падает программа, лол.
Hackers delight уже советовали?
Можно просто писать логфайл
[code]
for (int i = 7; i >= 0; i = i - 1) {
bool p = (value & (1 << i));
cout << p;
}
[/code]
Если я в программе напишу value = 110, то все правильно. Выводится 01101110, но если ввести это значение с клавиатуры, то выведется 00110001. Может это связано с тем, что visual studio тип int8 определяет как char?
Забыл сказать, что у value тип INT8
Прочитал, что происходит при знаковом типе. Слева записывается бит знака. Но меня удивило почему это работает для значения, заданного в коде.
Читай int кастуй к uint8_t.
49 не нужно было выводить. Короче я понял. Int8 для компилятора тоже самое, что и char, поэтому ведет себя странно
Да причём тут это? Анон char вместо int считывает. Вот и вся проблема.
>В основном интересуют вопросы по тонкостям языка
Если тут все прорешаешь, то вопросы по тонкостям будут не страшны: http://cppquiz.org
Нет, не правда. Там неплохие контейнеры, но нет никакой проблемы написать контейнер, которые в определённой задаче будут работать чуточку быстрее и тратить меньше памяти. То есть, там много настроек которыми можно попробовать это исправить, но использовать их сложнее, чем написать свой контейнер, на мой взгляд.
Правда. В стандартной библиотеке все самое шустрое. Если уж не в ней, то в бусте точно. Манек, которые пишу не кроссплатформенные решения на коленке зато на 5% быстрее даже не слушай.
Ссылка в шапке есть, хоть и в самом низу. Никто не читает шапку.
Хеш таблица (std::unordered_map) там не очень. Хотя если тебе хранить меньше десятков/сотен тысяч элементов, то разницы нет.
для 99.9% задач - да.
>Хеш таблица (std::unordered_map) там не очень
Теоретически, ты свой аллокатор можешь написать, чтобы память под каждый элемент не выделялась.
Какой-нибудь small_vector где проаллоцировано пара десятков элементов не помешало бы.
Или что-то вроде small string optimization, но для вектора.
>к отдельному байту
uchar тебе в помощь
>к отдельному биту
Смещаешься оператором >> и обрезаешь ненужное &1
>Как сравнить указатель с числом? Как делить указатель на число? В общем как рвботать с указателями как с числами?
Разыменуй.
int a = 228;
int b = &a;
std::cout<<b==a;
>В общем как рвботать с указателями как с числами?
reinterpret_cast<size_t>(p), наверное, где p - любой указатель. Или просто ((size_t)p).
>Как делить указатель на число?
Мне кажется, ты делаешь что-то не правильно. Зачем делить указатель на число? Может быть тебе нужен остаток от деления, хотя бы?
>>59405
Картинка, наверное.
А в обратную сторону сработает, если чуть подправить? Чтобы указателю присвоить значение? Или reinterepret_cast? Только сейчас о нем прочитал
Спасибо
Ты смотри только аккуратно https://www.viva64.com/ru/t/0030/
Зачем тебе это, не лезь, дибил, оно тебя сожрёт
если ты разыменуешь указатель на неконстанту, то сможешь присвоить значение
А до как узнать до каких пор считывать? Нагуглил функцию свойство процесса PeakWorkingSetSize. Но как его применить? Память то может в любом месте выделиться. Я вот не знаю как ос память выделяет. Может она постранично выделяет и тогда я смогу посчитать колличество выделенных страниц, следовательно уже прочитанную память. Так смогу понять стоит ли читать дальше или нет.
Я за память не шарю, но много раз видел схему, где исполняемый код находится после данных. Я смогу определить, что кусок памяти исполняемый и прекратить поиск. Но что мешает разработчику пользоваться памятью за исполняемым кодом.
Так гаверное и буду делать. Но вопрос: память выделяется постранично или произвольно?
Так наверное и буду делать. Но вопрос: память выделяется постранично или произвольно? Я конечно погуглю сейчас, но хочу удостовериться
Услышал тебя.Добро. В таком случае у меня все схвачено. Я кабанчиком за код. Может по ходу вопросики появятся, надо будет обкашлять. На созвоне.
Постранично. Размер страницы 4096 байт. Запрашиваешь информацию через VirtualQuery, фильтруешь регион, дампишь память и потом ищешь в буфере то что нужно.
Я думаю, он о том, чтобы вектор небольших размеров все на стеке хранил, без аллокации. Спорная идея, лучше какие-то временные буферы использовать.
[code]aaa
aab
...
ccc[/code], а
a
b
c
aa
...
Несколько дней бьюсь, но алгоритм в голову не приходит. Это ведь простое что-то.
Обычно со временем приходит понимание что во многих вещах есть какие-то закономерности. Увидишь их, формализуешь, то кодить станет гораздо легче.
https://ideone.com/7yEe0Q
Сегодня с утра встал, решил покодить. Внезапно частное от деления округляется в меньшую сторону до целого, хотя тип double.
Вот буквально такой код:
double z = 3 / 2;
Alert(z);
выдаёт 1. 1/2 выдаёт 0. Если задать z нецелым, то выдаст заданное как положено.
Что случилось-то? Я сейчас крякну.
3.0 / 2.0
UPD 3.0 / 2 даёт ожидаемый ответ.
У меня программа так написана, что cout для ответа отрабатывает только тогда, когда итог операции x^n+y^n=z^n целое число. Тут наверняка проблема с типами данных у переменных.
То есть, если при выполнении x^n+y^n извлекаемый корень из суммы целое число, то cout отрабатывает.
А с чем тогда сравнивать? Как определить, что число целое? Ну, то есть после запятой только нули.
Ну а хули ты хотел от целочисленного деления? Скорее всего тебе даже компилятор поругался.
Просто ты говнокод написал.
Это опять я. Нашел такое утверждение "Конечный адрес памяти равен ImageBase + ImageSize. Эти значения берутся из заколовка PE файла". Почему мне никто не сказал? Это же куда лучше того, что предложил я.
Или не надо... Чет я запутался
vector<char*> meh;
meh.push_back((new string("Test")));
Хуйня, да?
Мне просто было интересно.
>torrent
К торрентам ведь нужно примагнититься, ну или каким-то образом узнать адрес пира, чтобы получить данные. У меня стоит задача написать распределённую БД, и после передавать по ней один и тот же файл. Я практически полностью понимаю как это сделать, кроме одного момента: как новый пир узнает обо всех остальных, если нет центрального сервера, который отошлёт ему список всех участников сети? В интернете удивительно мало информации по данной теме, ну либо я неправильно ее ищу, поэтому и прошу помощи хоть алгоритм примерный
Бля да я учусь, просто для задачи одного файла достаточно. Мне бы сделать так, чтобы при появлении нового хоста он делал запрос ко всем остальным вот на этом моменте я и туплю, и получал текущее состояние файла, а дальше просто пинговал раз в пару секунд остальные ноды и сидел тихо пока управление не дадут.
А зачем запрос текущего состояния?
Зачем кто-то из участников сети должен знать об остальных?
Просто раз в какое-то время участник бродкастит всем список файлов и их хэши, другие ловят, отличается - поехали качать разницу.
Хотя не уверен, что для большого количества файлов это нормально сработает.
Не так буквально.
Широковещание здесь в том смысле, что не кому-то конкретному, а просто всем - кто смог принять сообщение, тот принял. Главный косяк этой системы будет в случае возможного модифицирования файла сразу несколькими клиентами, придется как-то разрешать конфликты.
dht
Сап. Есть формула, типа
double f(double a){
return sin(a)cos(a) + sin(a)sin(a)cos(a) + ...;
}
Нужно ли самому, в 2к19, повторяющиеся члены рассчитать самому, типа sca = sin(a)cos(a), или няша-компилятор все сделает сам, и не придется лишний текст писать?
Синус - не constexpr, выше где-то было обсуждение этого дела, так что не выйдет повесить это на компилятор.
Но если ты найдешь формулу приближения и тебе не очень важна точность, то их уже можно вычислить на этапе компиляции.
Спасибо, хороший сайт.
С -O3 разницы нет, без оптимизации всё, конечно, в лоб.
https://godbolt.org/z/Vke05x
CLang, пидорас, почему-то не соптимизировал нихуя код, gcc и очевидно icc делают всё хорошо. Не ожидал от цланга такого, пиздос, я на нем сейчас собираю
Мне код абсолютно понятен, но тебе не понять...
Я в ваших крестах не очень разбираюсь, я вообще из другого языка, но смотрю проект и тут такой вот блок
Можете подсказать, что тут происходит?
Нет. Здесь есть параметр OcrScaleFactor: его значение по умолчанию (не заданное, это баг), функции его сохранения в настройки и получения из настроек. QSettings хранит их в ini файле или в реестре (это в винде по умолчанию).
GUI тут нет вообще.
держи классическую задачку с сантой и оленями:
Санта Клаус постоянно спит, до тех пор, пока не будет разбужен либо всеми девятью северными оленями, вернувшимися из своего отпуска, либо любыми тремя эльфами из его десяти эльфов. Если Санту разбудили олени, то он запрягает их всех в свои сани, доставляет игрушки и, наконец, распрягает оленей (отправляя их обратно в отпуск). Если же его разбудила группа эльфов, он провожает каждого из них в свой кабинет, консультируется с ними по поводу игрушек. После этого он выводит каждого эльфа из своего кабинета (отправляя их обратно работать).
Санта должен отдавать приоритет оленям, в случае если его ожидают сразу и олени, и группа эльфов.
>Санта должен отдавать приоритет оленям
олени > эльфы
алсо я не секу в вашем мл, в чем задача то?
Кто приоритетней?
Как понять: он копируется или перемещается? Вроде ещё есть copy elision. Он тут играет роль какую-то?
Копируется. Если функция будет возвращать указатель, то будет "перемещаться".
Для перемещения*
Что за getVec()?
Смотри. Допустим есть метод doSomething(). Ты можешь объявить его как vector doSomething(), тогда он будет возвращать вектор, а если объявишь его как vector* doSomething(), то он будет возвращать указатель на вектор. Используешь в зависимости от своих потребностей.
Не совсем понимаю, что ты хочешь сделать, н овангую, что тебе вообще ничего не надо возвращать, а просто написать void-метод, который будет что то делать с твоим вектором.
Пиздовать читать стандарт, там все сложно. Начиная с С++17 copy elision происходит обязательно, вроде даже всегда, но мув/копи конструкт/оператор= всё равно может вызваться уже после завершения твоей функции, например, если ты делаешь
vector<T> hui = f();
> Не совсем понимаю, что ты хочешь сделать
Возвращаю координаты соседних тайлов.
Функция принимает на входе координаты тайла (жёлтый) и расстояние (радиус) вокруг которого мне нужно получить координаты (серые). На пике расстояние равно 2.
>не заданное, это баг
С чего ты взял, что оно не задано? Статик конст в хидере только с С++11 можно прописывать.
Не собираюсь его читать, пока жареный петух не клюнет.
тут сразу ошибки проектирования:
вместо того чтобы работать с голым вектором, его следует обернуть в класс (к примеру набор неких "документов" у тебя будут хранится не напрямую в векторе_документов, а делаешь класс "реестр документов")
далее в си и крестах значение функций чаще используется не для возвращения результата работы, а для кода ошибки/успешного завершения, а в случаях когда принято решение не использовать исключение, то тут и вообще нет выбора
а результаты работы функций возвращаются через параметры-указатели
но в современном с++ делают по другому - возвращают результаты работы через владеющие смарт-пойнтеры
такие дела
>И как я из итератора узнаю сколько элементов в векторе? Зачем мне его хранить всё время работы программы?
Я так понял, что у тебя таблица, и тебе надо для ее элементов делать какие-то действия с соседними ячейками. Если ты будешь возвращать вектор, содержащий соседние ячейки, это будет не очень быстро работать, если таких обращений много из-за динамичекской аллокации. Если он храниться все время программы, то лучше конечно вектор. Если обращаешься часто - кастомный итератор (в котором ты спокойно можешь хранить и размер вектора).
> возвращают результаты работы через владеющие смарт-пойнтеры
А это не противоречит принципам ооп?
Можно: Klass().method();
Нельзя: Klass k; k.method();
Ох, не так понял. У тебя через синглтон надо делать.
но "инты" то что то означают? разве нет? что у тебя там - длины хуйцов твоих половых партнеров или зарплаты бати за последние три года
что то они должны означать
Тогда удалить или сделать приватным стандартный конструктор. Гугли "c++ singleton".
Если не накосячишь компилятор сделает RVO и копирования/перемещения вообще не будет. На современных компиляторах часто выгоднее возвращать по значению.
Хочу, чтобы объект удалялся сразу после вызова метода. Ему больше незачем жить.
заверни это в обычную функцию
в ней будет создаваться объект, вызываться его метод, удаляться объект
Вот этого слушайте
>Хочу, чтобы объект удалялся сразу после вызова метода. Ему больше незачем жить.
Тогда сделай конструктор приватным, а функцию Klass() объяви как friend. То есть создавать объект сможет только она.
Нужно.
Во флотах a (b c) != (a b) c, поэтому компилятор не сможет вынуть такие вычисления с плавающей запятой. Возможно --ffast-math или /fp:fast могут заставить игнорировать это, но фиг знает.
Зачем тебе тогда объект? Это просто функция.
Фабрика. Ну и если тебе нужно чтобы метод вызывался только раз для каждого созданого объекта, но сам момент вызова не сильно важен то можешь сделать сам метод приватным а его вызов засунуть в деструктор. Тогда если ты сделаешь Klass() то метод будет вызыватся сразу (будет создан временный объект, сразу уничтожен с ваызовом метода). Если сделать Klass k; то метод будет вызван при выходе из текущего скоупа - если конечно это тебе приемлемо.
Что за угнетение я вас спрашиваю?
Нигги пишут на питоне.
Если это зафорсить, то можно заставить sjw, а следовательно и гугл вместе с другими крупными корпорациями, бойкотировать кресты. Тогда язык останется без поддержки и загнется.
Почему тогда "указатели" так часто всплывают в какой-нибудь иные?
Алсо, в сишечке почему-то нет ссылок, были бы не лишними констрефы
Ну и что же ты такое закодировал?
> Анон, а где в обычной программе в 2к19 я могу встретить указатели?
В старых проектах. В Си библиотеках.
У нас в проекте оптимизация переиспользования памяти на бекенде. Здоровенный массив хранится в памяти одним сплошным куском, а наружу отдаются вьюхи, имплементированные как связка поинтер + длина. Хотя может быть для этого сегодня уже есть либы.
Еще это нужно, если работаешь с QtQuick. Сущности из C++ в QML передаются через поинтер, а не референс.
Гугл советует использовать указатели вместо неконстантных ссылок для передачи параметров внутрь функций. Типа так заметнее, что значение b мутирует: foo(a, &b)
>а наружу отдаются вьюхи, имплементированные как связка поинтер + длина
типа std:string_view что ли?
как вьюхи то сделаны? свои костыли?
>а наружу отдаются вьюхи, имплементированные как связка поинтер + длина
или типа как буфера в asio сделаны?
Gcc и msvc оптимизируют, clang только с ffast-math. При этом clang без ffast-math еще и sin-cos вызывает каждый раз, даже если встроенные функции использовать:
https://godbolt.org/z/1tj_ng
Ну вот мне иногда приходится ковырять PCM-аудио, там без указателей не так. Или сжатие, как например Хаффман (который я выпилил нафиг, ибо побитово Хаффмана делать это зашквар).
Почему там без указателей никак? Там, вероятно, есть массив семплов, ну и передавать его везде через констреф в крестах. В сишечке то конечно, может быть даже цос и стоит на си делать.
> Почему там без указателей никак?
Написано в бородатых годах? https://www.youtube.com/watch?v=z0NfI2NeDHI
Все системное программирование - это ехал указатель через указатель, потому-что си. В нормальном продакшен коде на современных крестах указателей должно быть минимум.
Могу я загнать эту часть в lib файл оставив только хидеры? При этом нужно, чтобы кто-то ещё мог дописать кода и скомпилировать. Это то что мне нужно?
именно для этого почти все умные указатели могут отдавать свой сырой указатель который инкапсулируют
типа у себя в коде с умными указателями работаешь, а в старые библиотеки отдаешь сырые указатели на обработку
конечно можешь
но придется поразбираться, там много неочевидных вещей начиная с того что .lib файл может как содержать объектный код, либо только содержать секции импорта-экспорта и тому подобные заморочки
Учитывая RVO, гарантируется ли то, что в случае выброса исключения внутри функции объект останется нетронутым?
точнее так
Object object;
try {
object = eta_funkciya_vozvraschaet_object();
} catch (...) { // объекту пизда? }
Мне тоже стало интересно и я накидал код на 30 строк. RVO происходит, только если я пишу "Object temp= make()", если я пишу в две строки "Object temp; temp=make();" (как в твоём втором посте), то там move-конструктор. То есть ситуации, когда в object что-то хранится и оно сломается просто невозможно достичь, потому что для этого нужно объявлять твой объект внутри try-секции, из которой он всё-равно никаким образом не выплестнется.
>>62701
Мм, отлично, спасибо.
Имеет смысл, или устарело с момента выхода условного второго пентиума?
И аналогичный вопрос для 64-битных программ, продолжать использовать 4-байтовый (unsigned) int или 8-байтовая переменна будет быстрее на (0.5%) из-за восьмибайтового выравнивания в памяти?
Ненужна если ты не пердолишь ембед.
Ультимативный байтодрочер.
везде size_t
Это очень норма, мне даже автокомплит vs2017 давал size_t для циклов.
Как раз недавно классы делал, где решал, инт или size_t для размеров. Не очень хорошая ситуация происходит, когда делаешь вычитание, приходится тернарное сравнение делать:
size_t a = 10; size_t b = 5;
size_t ba = b > a ? b - a : 0;
Бесит.
Гуглить отдельно. Почитай хабрец. Там вроде много всякого было.
Некоторые алгоритмы получаются немного проще, если позволить счетчикам уходить в минус.
Unsigned счетчик при этом переполняется и приходится принимать дополнительные меры.
Читаешь по N бит сразу. Лезешь в таблицу и смотришь, какой символ эмитить и на сколько бит нужно сдвинуться. В дофига раз быстрее и всё ещё просто, все нормальные посоны так делают.
можешь рассказать личный опыт использования? что по твоему лучше сделано? буфера в asio, boost::interprocess или вообще сейчас string_view использовать?
я хз, но если ты типа пишешь modern c++, то вообще можно без счетчиков, работаешь через итераторы и обобщенные функции
Все арифметические операции над знаковыми/безхнаковыми одиеаковые благодаря дополнению до двойки. Также без разницы, использовать int32_t или int64_t - регистры-то одни. Хотя, если так уж интересно, посмотри таблицы Агнера Фога.
Привет, крестаны.
Перекатился 4 месяца назад из джава-тырпрайз-манямира в десктоп-разработку, проекты у компании все на Qt.
Вроде все и хорошо, но надо бы построить вменяемый DevOps тулчейн, пушто динозавры в нынешней конторе только-только осилили Git вместо SVN, и в настоящий момент катастрофически не хватает менеджера пакетов/зависимостей, пушто нынче каждый чих ведет к пересборке кучи проектов и ненужному мусору в Git.
Беглый гугл подсказывает что есть Conan и Buckaroo, но по обоим исчезающе малое количество инфы. На какой стул лучше сесть?
продуктивно в смысле быстро? не, не получится
У меня обратная ситуация.
Писал несколько лет десктоп на Qt в подобной конторе (где даже svn, а затем гит разворачивал сам, лол).
Устав от низкой ЗП, которую еще и постоянно задерживают, и методологии разработки прямиком из 90х, пытаюсь перекатиться в джаву.
Какие подводные?
Если уж и байтоёбить, то надо еще учитывать сколько байт в инструкции. Поскольку буфер декодера маленький, 1 такт можно потерять.
По хорошему надо тест проводить.
>если так уж интересно, посмотри таблицы Агнера Фога.
Интересно, посмотрел. Долбать fdiv/idiv тормозные, конечно, почти как квадратный корень.
Пойду выпиливать все деления. И остатки от деления. Ужас, это получается лучше сохранить две размерности двумерного массива, чем каждый раз считать компоненты через / и %. А я то думал, это за один такт работает (для целых чисел) и для небольшого массива 20x30 можно через деление и один индекс всё делать.
Если ты делишь на константы, то компиляторы умеют заменять деление умножением самостоятельно. Ручной вариант примерно такой(но смысла мало):
unsigned long long k = 1000;
//деление на 5
k = 858993460;
k >>= 32;
printf("%lld\n", k); //200
k = 1337 90;
//деление на 1337
k *= 3212392;
k >>= 32;
printf("%lld\n", k); //90
Умножение pipelined и снимать результат умножения с порта можно каждый такт если нет data dependency.
Если делитель переменная величина, то не могу ничего подсказать.
k = 1337 * 90;
_mm512_div_epi64 например. Уж лучше чем насиловать процессор кучей делений.
>>63026
Спасибо, анончики. Буду посмотреть.
>>62972
Ну так и чо, предлагаешь сидеть и не рыпаться, ждать пока кто-то другой соберётся и тратить по полчаса на каждую сборку?
>>63039
> Какие подводные?
Работа с тырпрайзной джавой превратилась из написания кода в написание конфигов для зоопарка генераторов кода, генераторов генераторов, генераторов конфигов для генераторов генераторов. И всё это с воплями ПОТОМУ ЧТО ЭТО ПОЗВОЛИТ СКОНЦЕНТРИРОВАТЬСЯ НА РЕШЕНИИ ЗАДАЧ ВМЕСТО НАПИСАНИЯ РУТИННОГО КОДА.
>Ну так и чо, предлагаешь сидеть и не рыпаться, ждать пока кто-то другой соберётся и тратить по полчаса на каждую сборку?
в смысле? у тебя будут компилится только измененные файлы (которые сам изменил или вытащил из гита), это быстро, линковка щас тоже быстрая тк линковщики неплохие щас
а полную пересборку проекта под целевые архитектуры и прочее, с прогоном тестов и прочим делается на отдельном сервере ночами или как там у вас, в общем зависит от того как настроен ci/cd на фирме..
а не лучше ли в твоем случае просто сменить фирму, но сохранив специализацию qt/кресты
> как настроен ci/cd
> ci/cd
> в компании перешедшей на Git в 2018 году
Вот ты взялся надо мной стебаться мол я ещё молод-зелен процессы рабочие настраивать. А процессов-то того, нету.
Что-то вроде буста.
The short answer is that we are indeed planning to propose our reference implementation for Boost. It will be a great opportunity to get it into people’s hands sooner while we go through the process of standardization. Additionally, libraries like Boost.Container show that there is room in Boost for filling in implementations for compilers that do not provide a complete standard library.
But submitting a library like this to Boost is orthogonal to submitting this proposal to ISO C++. C++ is still missing out-of-the-box access to a piece of fundamental and very common hardware.
Источник: http://wg21.link/P1386R2
> But submitting a library like this to Boost is orthogonal to submitting this proposal to ISO C++. C++ is still missing out-of-the-box access to a piece of fundamental and very common hardware.
Короче, нужен какой-то менеджер пакетов?
Они хотели сказать, что audio это фича, которая "ну вот очень нужна" поскольку звуковушка есть в каждой машине. Ну это то, как я вижу их слова. В std хлама ведь нету совсем. Надеюсь меня простят, что я так слова искаверкал.
Что им мешает свое говно как либу сделать?
Или добавить в буст? Клавиатура вот действительно в каждой машине есть
По поводу либы, они даже сделали свою https://github.com/stdcpp-audio/libstdaudio. правда пока только для мака(винда говорят как только так сразу)
Я у них в предложении похоже нашел ответ.
Wouldn’t it be great if the basic functionality of talking to your sound card would come for free with every C++ compiler, as part of the C++ standard library? Not only would it allow one to write truly cross-platform audio code, but it would also lower the barrier of entry for learning.
Видимо так. "truly cross-platform" меня немного пугает. Особенно когда некоторые пишут код с фичами, которые поддерживает лишь их компилятор.
UINT64 Address = 0;
Address = reinterpret_cast<UINT64>(Address + 4096);
Ошибка: C2440 'reinterpret_cast': cannot convert from 'UINT64' to 'UINT64'
[/code]
Я понял. Я зря кастую. 4096 кратно 64 и поэтому можно спокойно без приведения типов.
Поищи, как выключать синхронизацию плюсовых и сишных потоков - тогда cout'ы будут быстрее, но printf больше нельзя будет использовать.
А если как хочешь ты - просто выводи на экран в другом потоке.
Операции вывода какбэ буферизуются, если ты что то вывел в файл или сиаут это не значит что туда что то реально записалось, если ты принудительно не очистил буфер. Программа продолжает работать не дожидаясь реального вывода.
>>63595
>>63597
>>63598
>>63685
Кому верить? И еще дополнительный вопрос. Как узнать самые медленные места в программе? Есть ли анализаторвы какие? И как понять во что упирается программа? Скорость чтения-записи маленькая и стоит снизить колличество обращений к памяти или еще что? Еще надо глярут че там у меня по занятости процессора. Если он занят на 25% то можно еще поток заебашить, а если нет то не надо. Я правильно рассуждаю?
Каждый кусок дублируешь два-десять раз и смотришь стало ли медленнее. Если не стало, то тормозит что-то другое.
Можно каждый кусок обвешать rdtsc-шками, 100 наносекунд оно тебе спокойно посчитает с неплохой точностью. А если специально в цикле на нескольких итерациях гонять, то там можно доли процента выцепить.
Если тебе просто померить то >>63964 неплохой вариант. Если что-то по серьезнее то https://software.intel.com/en-us/articles/intel-architecture-code-analyzer
Разбор cpu по евентам. Был еще guthub репозиторий основанный на его работе, но я потерял ссылку, если у кого есть скиньте сюда.
Да всем и верить. Просто выбери то, что тебе больше нравится или проще будет реализовать.
Я могу добится нужного результаиа с помощью побитовых сдвигов, но так было бы удобнее
Хм. Наверное, стоит сделать биттвое поле с юнионом, типа
struct Foo {
union{
uchar bits0 : 1;
uchar val;
} field0;
union{
uchar bits17 : 7
uchar val;
} field1;
}
Структрка Foo займет один байт, и вроде работает uchar &p = *foo.field0.val;
Условием сможешь чекнуть, что p == 0.
Я не проверял.
>>64099
Анализировать целиком значение и сдвигом искать - по скорости будет также, если не быстрее. Естественно, чем больше известно входных данных, тем будет проще. Если знаешь точное число, можно взять его разрядную сетку, числа в памяти маскировать, сдвигать и сравнивать с паттерном. И спросить об этом в Си разделе, это их говно.
Да, поиск сначала делай по целым числам, не нашел - двигайся по байтам и бери 1, 2, 4 или 8 байт в зависимости от размера паттерна
> Если знаешь точное число, можно взять его разрядную сетку, числа в памяти маскировать, сдвигать и сравнивать с паттерном.
Да я так и хотел. Обрезал до первого значащего бита и пытался так шагать. А потом вспомнил что я смешаю указатель на байт, а не на бит.
То есть никакой долбаеб не будет хранить значение так, как я сказал? А всякие cheat engine найдут такое значение?
https://ideone.com/rEMkat
Я бы вот примерно так написал, если на коленке, если прям по битам. Но это совершенно точно не самый быстрый алгоритм (быстрее подготовить 8/32 маски, и 8/32 верных значения, и прыгать сразу по 1/4 байта без битовых сдвигов), и он за границу массива выходит.
Каким образом ты будешь идентифицировать конкретную переменную, если найдёшь, например, 623 мест с подходящей комбинацией бит? Или есть несколько пар дампа памяти и значения переменной, так чтобы можно было отсеять?
>Вдруг разрабы заморочились и сделали такую переменную
А на чём написана программа? Если высокоуровневый мусор, то шанс использования отдельных бит исчезающе мал, мне кажется, но точно не уверен.
Сверху массив рандомных значений, просто чтобы потестить.
find - то что нужно найти, size - его размер в битах.
mask - хуита (маска) вида 0b0001111, на которую я побитово умножаю (через &) очередной байт.
Далее, я циклом прохожусь по всем массиву (по каждому байту), но беру за раз по 4 байта (чтобы после сдвига там остались ненулевые биты, то есть значение размером в 27 бит этим говнокодом не найти(точнее, найти, но в любой позиции)), которые находятся в part.
Во втором внутреннем цикле я 8 раз (по числу бит), бинарно смещаю этот part, умножаю на маску и сравниваю с нужным значением. Вывожу номер байта и бита, если совпало.
>>64145
У меня работает, что там по стандарту должно быть - не знаю.
Попробуй перегрузить точку или стрелку
> Как узнать самые медленные места в программе?
Можешь через профайлер прогнать. Он покажет какие функции сколько времени работы программы используются.
А дальше уже можешь попробовать что-то в них поменять.
Так как я не особо разбираюсь, я ввёл каждую из этих функций, но при этом мне нужно, чтобы при вводе cmd 1 выводилась функция 1 (сделано), при вводе 2 (после функции 1) включалась функция 2 (это тоже работает) и при вводе 1 (после функции 2) включалась функция 3 (а вот тут пиздец) и так далее. Типа такой цепочки действий. Если подскажете в каком направлении искать инфу, буду очень благодарен.
Писал функции через if else, но не ебу как в int main указать поочерёдность выполнения каждой из них
То есть чтобы на каждую функцию был выбор из двух действий, как, например в текстовом квесте
Как именно происходит это связывание, если упрощенно? Препроцесситься хедер, потом обрабатывается компилятором/линковщиком и на выходе получаем имена сущностей, определенные в хедере, которые потом ищуться в символьной таблице подключаемых библиотек? Т.е. меня интересует этот вопрос в таком контексте что если хедер библиотеки как-то не так обрабатывается при компиляции, например используются другие правила для манглинга имет функций, то на выходе мы получим ошибки линковки/загрузки?
Делай граф
Не понял. Ты во всех случаях вбиваешь 12345, или ты можешь ввести 13, и у тебя должна активироваться третья функция после первой?
Может быть тебе нужен массив указателей на функции, чтобы их можно было вызывать по номерам?
Не знаю что ты хочешь сделать, но если у тебя пять функций где логика привязана к номерам функций, то это то что тебе пригодится.
И матрицу/таблицу переходов прикрути. В твоём случае 5х2. Есть одна из пяти функций и ответы 1/2, при которых осуществляется переход на функции с номерами указанными в матрице. Например, так: https://ideone.com/uMscJD
стейт-машина, конечный автомат..
гугли..
вариантов реализации масса, самые простейшие это комбинация if-else с флагами состояний либо таблицы выбора..
есть и более сложные подходы..
У вектора есть .capacity()
Есть reserve(). Ещё подумой, не стоит ли тебе list использовать, там на это похуй
есть еще дек, он хранит элементы другим способом - чанками
поэтому получается что дека на вставку будет быстрее работать чем вектор
тут нужно делать выбор в зависимости от задачи
так как вектор хранит все данные одним куском памяти
это дает скорость при прямом обходе элементов
в то время как очевидно что в деке прямой обход будет чуть-чуть медленней тк придется скакать между чанками
так же вектор может отдать свои данные одним куском своей сырой памяти, при помощи вектора удобно работать со старым сишным кодом, которому нужны массивы и сырые указатели
с деком же так не получится
по итогу, вектор получается универсальней, за счет увеличения амортизационной сложности на вставку
помимо вопросов, связанных с производительностью и с совместимостью с сишным кодом, как минимум еще нужно помнить о том что некоторые контейнеры и контейнерные адаптеры "портят" итераторы и сырые указатели на их элементы, а другие - не портят
опять же, выбирать контейнер следует исходя из требований задачи
ну а вообще, конечно, да
когда примерно знают, сколько места займет вектор, то делают предварительный reserve(), возможно c последующим shrink_to_fit() - щас он в стандарте, а раньше делали трюк со swap()
это позволит сделать оптимизацию по времени для интенсивных вставок в вектор, при первоначальном заполнении, например
Пишу залупу с потоками и для потока пикрил получаю ошибку 2893 и 2672. Нихуя не понимаю как лечить.
Лучше ибупрофеном, так дешевле.
А с потоком что делать? Проблема в сигнатуре, причем явно ругается на типы значений, но в чем конкретно проблема я не пони.
Охуенное описание ситуации в целом и проблемы в частности. Тут же весь тред наизусть помнит коды ошибок 2893 и 2672. Просто помогать не хотят и траллируют.
Ну ебать, не засирать же тренд копипастой с мелкомягкие.док, а по номеру вполне рил найти.
https://docs.microsoft.com/en-us/cpp/error-messages/compiler-errors-2/compiler-error-c2893?view=vs-2019
https://docs.microsoft.com/en-us/cpp/error-messages/compiler-errors-2/compiler-error-c2672?view=vs-2019
Шо еще описать, я не ебу. Делаю все как по буквам, в сигнатуре функции запускаемой в потоке все указываю как в гайдах, в сам объект потока передаю через std::ref, но на этапе сборки мне вываливает вижуалка эти ошибки.
Тогда бы код запостил или хотя бы тот гайд. Как блять мы тут должны по скрину одной строчки всё понять и починить?
Ну проверь, где ты эту функцию используешь, где какие типы ожидаются и какие на самом деле.
Я вообще не согласен с фразой "вектор - универсальный". Там любой контейнер универсальный. Лично я, например, чаще использую лист, и вот он для меня универсальный. Универсальный
>list использовать, там на это похуй
Не совсем. Лист все равно использует аллокацию. Пускай только для одного элемента, а не для всех как у вектора. Но аллокация все равно очень дорогая процедура.
У меня в листе только емпти() проверяется например. Там вроде константа. И поиски ещё в листе, если данные не имеют какого-то известного закона распределения, то поиск с вектором вроде одинаковый по сложности.
Промахнулся. Если модер удалит эту хуйню, было бы неплохо.
Начить изучать конкретные библиотеки типа OpenGL или Vlukan?
Я правильно понимаю, что это указатель на массив из 6 элементов класса Player?
В таком случае что делает эта строчка?
itsPlayers[0] = ЗВ(new Player());
> В таком случае что делает эта строчка?
Уничтожает память
параллельно копируя только что созданный объект
Для примера, мне нужно, чтобы программа выводила квадраты чисел, т.е. я ввожу 2, программа вывод 4, ввожу 3, программа выводит 9 и тд. Можно ли куда-нибудь записать несколько значений, для которых программа должна будет выполнить проверку, не выходя из окна консоли?
Я имею ввиду, для любой программы, не только для квадратов чисел. Если у меня будет несколько последовательностей, и чтобы не вводить несколько тестов каждый раз, написать их где-нибудь однажды, и программа выведет результат работы с тестами.
Напиши в файл. Пусть программа читает входные данные и результат, который должен получится. Если ее вывод не сходится, то пусть выводит сообщение об ошибке
Я уже 3 часа ломаю голову над тем, почему в добавку к заданным игрокам выводится стандартный игрок 1. И если в ideone все выглядит так, словно массив при резервировании памяти инициализируется конструктором по умолчанию, то на моем пк все выглядит так, где первая цифра позиция в массиве, вторая позиция игрока, а третья его высота..
Ну и пиздец...
Какие приватные атрибуты в 9 строчке, у тебя все публичные. Нахуй столько указателей. Почему ты за ними не следишь. etc
>И если в ideone все выглядит так, словно массив при резервировании памяти инициализируется конструктором по умолчанию
Да так и есть.
И у тебя так же.
Просто в "конструкторе умолчанию" ты position не инициализировал и в нём мусор, вместо значения.
мимо чайник
Чтобы иногда работало. Мусор коварен.
Написал для использования в работе некую приблуду, 6к строк на крестах с Qt.
В мои рабочие обязанности эти не входило, но прогу заценили и вовсю используют.
Исподники я естественно никому на работе не показывал и не собираюсь, но хочу взять патент на это дело.
Я правильно понимаю, что для того чтобы всё было чисто, мне нужно либо избавиться от Qt, либо купить соответствующую лицензию?
Лицуха стоит неадекватных для этого случая денег (хотя за прогу я получил прибавку 25% к з/п и премию в две увеличенных з/п).
Так-то переписать на голом WinAPI проблем нет, хотя время это займет, Qt использовал чтобы побыстрее получить результат.
Ты через new выделяешь память и тут же о ней забываешь, т.к. нигде ты не сохранил указатель, который тебе new вернул. Это утечка. Не стреляй себе в ноги, возьми связку vector+unique_ptr
Ты можешь использовать бесплатный в коммерческих проектах при условии соблюдения требований LGPLv3. Сама GPL довольно сложно составлена, и нужен профильный юрист, чтобы пояснить, возможно ли в твоем конкретном случае использование этого продукта.
Минимальное требование - динамическая дин ковка.
Очевидная линковка*
А зачем патентовать всё? Патентовать нужно только твой мега-супер алгоритм, отвязав его в твою либку, к которой подключается qt со всем гуи. Наверняка же у тебя вся мякота сводится к нескольким функциям, зачем тебе там qt?
Я как-то раз в одну контору устраивался и отказался т.к. в ТД был пункт о том, что всё что я напишу\придумаю (вплоть до всяких слоганов, рисунков и тд) будет принадлежать компании.
Пришлось отказаться.
ты в россии?
как трудовой договор был состален? типовой?
вообще то если ты создавал эту прогу в рабочее время по заданию работодателя, то имущественные права на этот интеллектуальный продукт принадлежат фирме, на которой ты работаешь..
то есть обычно ты работаешь по специально созданному трудовому договору, в котором не происходит передача имущественных прав работодателю на интеллектуальный продукт, который ты создаешь, работая на эту фирму? дак что ли, а?
Ты не русский? Ты не знаешь значения слово договор?
РФ.
ТД типовой.
Разумеется в нерабочее время, на своем оборудовании и по своей инициативе.
В мои обязанности это никак не входило, и вообще я не кодер.
Более того есть целый отдел который должен заниматься и этим тоже, но вот как-то они не додумались, за что им вставили пистон, когда я вылез с этой темой.
Патент мне нужен для документально зафиксированной ачивки.
А ещё я слушаю регги.
Выложи на гитхаб и приложи файл с лицензией. Ну если ты готов показать исходники, конечно, оставляя за собой авторство.
GPL налагает ограничения на распространение проги. Если она используется только внутри компании и вообщн никак не контактиркет с наружними сераисами, то ЕМНИП всё нормально. Но ты анону не верь, а почитай сам.
А, блин, жопой читал. Ты не хочешь вообще никому показывать исходники. Тогда проблема, да.
Блядь, да ему свои две функции скомпилить в либу и всё, зачем придумывать сложности
Спасибо всем откликнувшимся, в общем буду перерабатывать на голом C/WinAPI, хардкорность не пугает - предмет знаком.
Вообще изначально я не думал что так взлетит и будут активно пользоваться - делал чисто для себя из интереса, Qt использовал чтобы побыстрее получить работающий прототип.
А что за программа-то хоть? Что она делает?
If the program dynamically links plug-ins, and they make function calls to each other and share data structures, we believe they form a single program, which must be treated as an extension of both the main program and the plug-ins. This means that combination of the GPL-covered plug-in with the non-free main program would violate the GPL.
Нужно хитрее. Например, клиент-сервер через сокеты.
Что такого в приложении для расписания на 8к строк? Хотя это и довольно обширное описание.
Конечно! Это - ссылка, точнее константная ссылка, const MyStruct &data. В 2к0 пацаны использовали указатели, но ща не надо так делатьб.
Вариант 1 - Project Options -> Debugging -> Command = имя exe-файла, который ее использует. Дальше расставляешь брякпойнты, F5 и понеслась пизда по кочкам.
Вариант 2 - Debug -> Attach to Process.
Использовал подход Model-View и Qml, в основном вышли большие модели. Из всего кода сам интерфейс занимает только 1к.
Прочитай гайдлайны и вылижи свой код. В логику глубоко вчитываться никто не будет, главное чтобы выглядело профессионально
То есть им будет похуй что конкретно я писал, лишь бы кодстайл по гайдлайнам был? Грустновато как-то
Это с джавой что-то? Можно хотя-бы ключевых слов насыпать, а то я с джавой не работал еще.
> Качество кода
Для этого статические анализаторы и автоформатирование.
Хотя наименование функций\классов\переменных оно не исправит.
Иногда, бывает, интересно узнать как другие всякие мелкие проблемы.
Например есть переменная которая хранит состояние и в коде есть проверки: state == STATE1 || state == STATE2 и тд
Можешь попробовать исправить эти места с использование какой-нибудь шаблонной йоба-магией.
Насколько отличаются разные версии QT? Если сейчас начать осваивать QT5, то через год нужно будет с нуля учить QT6?
В Qt6 вроде бы как начинку собираются менять, всё в 17 стандарт переведут. Из заметного знаю что в QML строгую типизацию завезут НАКОНЕЦ БЛЯТЬ
А андроид даёт какие-то сигналы о пробуждении приложения? Жрать ресурсы пока приложение даже не используется так себе идея, легче было бы просто пересчитывать таймер, благо в программе делается в пару строк всего. Ссылку не грузит, судил по названию, если там об этом написано то извиняюсь
>всё в 17 стандарт переведут
МинГВ, с которым он поставляется под винду, его до сих пор не поддерживает, так что хз.
Потому что учись работать с разными локалями
1. Перейди на CLion.
2. Гугли туториалы по массиву, даун.
3. Я бы сейчас задумывался о смене языка, потому что плюсы говно (если ты не хочешь в гейдев пойти)
4. Никогда не стоит спрашивать советы на двощей.
5. Если ты начал кодить - ты подписался на то, что 100% информации будешь учить сам.
мимо прошел этот путь
Второе нахуй не нужно, конструктор базового класса без аргументов и так вызовется.
Со всем, что не-ASCII, на Си/Плюсах лучше дела не иметь. А если иметь, то курить мануалы и надеяться, что ты будешь работать только с UTF-8.
форвард декларейшенами или распиливанием классов
Как пользоваться этой залупой? При создании заголовка автоматически создаётся и ifndef с именем файла капсом, но для чего это не ясно.
Скорее всего ты ебалду какую-то собираешься написать. Храни unique_ptrы на базовый класс и дёргай виртуальные методы, при очень сильной необходимости можешь сделать dynamic_cast к наследнику и дёрнуть невиртуальные методы
Мне нужно создать класс оркестр, класс музыкальные инструменты и 3 дочерних класса для муз.инструментов. Класс оркестр должен хранить элементы 3 дочерних классов и выводить их, при этом каждый из 3 доч. классов должен иметь свою собственную функцию вывода, переопределяющую таковую у класса муз.инструменты.
И я хуй знает как это реализовать.
А, бля, я забыл, что семестр начался уже. Иди нахуй короче, в универчике тебе всё объяснят, не зря же ты туда поступил.
>Анон, перспективен ли дроч ФП в крестах
Перспективен скорее dataflow подход в котором ты рассматриваешь свои данные как трубу, которая куда-то течет. В ФП-тусовке этим занимались лет 30 назад, пока не улетели в космос к монадам и стрелкам. Современное ФП в крестах не попишешь. Но понимать основные принципы ФП типа иммутабельности можно и нужно. В этом плане это намного полезнее дроча паттернов ООП.
> Всети корутины и фьючерсы связаны с ФП?
Ну так, опосредованно.
> std::transform уже умеет параллелить из коробки?
Не умеет, но есть неплохая либа Intel TBB, в которой соответсвующая функция есть.
Хотя OpenMP еще проще.
Такой вопрос.
Я написал два класса Canvas и Reader.
Canvas работает с bitmap ставит пиксели, отражает с права налево и сверху вниз, делает кроп и все такое.
Reader, название условное, читает и пишет .bmp. То-есть Canvas передает в Reader bitmap, а тот его преобразовывает в формат bmp и пишет в файл. Ну, или Reader читает .bmp, делает из него bitmap и отдает в Canvas. Чисто гипотетически я могу добавлять в Reader функционал для работы с другими форматами типа png или jepg, ну ясно я делать этого не буду, так как проект делается чисто для себя, что-бы подучится как вообще работать с классами и архитектурой.
Canvas взаимодействует с Reader через интерфейс самого Reader'а который у меня чисто абстрактный класс, а работа с конкретным форматом реализуется через наследника, который наследует интерфейс.
Собственно у меня два вопроса.
1 - Как правильно объединить Canvas и Reader. Функционально и идеологически это разные классы. Но все же они связанны между собой. Собственно вопрос, как вообще конструируют подобные вещи?
2 - Canvas и Reader у меня обмениваются кусками памяти, когда надо обменятся bitmap. Я просто передаю указатель на память и размер куска. Мне это очень не нравится, так как получается, что оба класса могут шарится по памяти друг друга. Собственно вопрос как сделать тут нормально и безопасно?
ООП из головы просто выкинь. Ты не замечаешь, что наворачиваешь сложность на пустом месте?
И не надо оправдываться тем, что "так как проект делается чисто для себя, что-бы подучится как вообще работать с классами и архитектурой". 99% проектов с этой хуйней. Пиши просто, понадобится - отрефакторишь.
>Как правильно объединить Canvas и Reader.
У тебя есть труба, по которой текут данные, и процессоры, у которых есть вход, выход, и (что противоречит ФП, но удобно) какое-либо минимальное внутреннее состояние.
>Canvas
Зачем-то делает слишком дохуя. Для разных действий нужны разные классы.
>Reader
>пишет bmp
Ну ты понял
>Canvas и Reader у меня обмениваются кусками памяти, когда надо обменятся bitmap. Я просто передаю указатель на память и размер куска. Мне это очень не нравится, так как получается, что оба класса могут шарится по памяти друг друга. Собственно вопрос как сделать тут нормально и безопасно?
Взять матричную библиотеку (eignen, armadillo, opencv) и обмениваться матрицами трехмерных векторов (потому что картинки RGB), которые внутри уже умеют в слайсы, copy-on-write и тому подобные вещи.
Если ты прямо вообще не хочешь пользоваться готовым, пиши собственный класс подобных матриц. Но, умоляю, выброси его, хватит с нас подобного говна в реальных проектах.
Спасибо конечно за ответ. Но он мне помог примерно никак.
Анон, реально спасибо тебе, но все же это совсем не то что мне надо.
Есть тут аноны которые дадут совет, не советуя при этом отказаться от ООП?
От ООП нельзя отказаться или не отказаться, потому что его не существует. Особенно в С++. Особенно в 2019 году. Просто нет такого понятия.
Ок.
Благодарю.
Когда придуман в 80-е? С тех пор 30 лет прошло. И за это время язык только становился дальше от ООП. Исключение тут разве что Qt с сигналами-слотами, но вот что реально умирает, так это гуи на С++.
С++ это мультипарадигменный язык. Можешь писать на адовом ООП с абстрактфакторипроксибинами а-ля индусская джава. Можешь писать на чисто процедурном диалекте, а-ля чистый С. Если угараешь по извращениям, то из С++ можно сделать почти функциональный язык программирования.
Сила С++ в том, что он сочетает в себе абстракции и низкого и высокого уровня, все зависит от программиста. И крутые С++ программисты, обычно, комбинируют парадигмы, и получается хороший и читаемый код.
ООП в каком-то простом варианте (RAII) - всегда будет в С++, а вот всякая дрисня типа АБСТРАКТНЫХ ФАБРИК - это пережитки двухтысячных, такое ООП мертво уже сейчас.
Изучая с++ на что лучше всего обратить внимание?
На потоки? - почти не разбирался с ними.
На rvalue? - хз что то. Не смог нормально разобраться пока
На тепмлейты? - разбирался, но не видел нигде практического применения кроме как в stl
На ООП? - вроде разобрался на начальном уровне но слишком объемная тема.
На шаблоны? - пока не брался за них и не знаю стоит ли.
На stl? - вроде ничего сложного. Удобно.
Отпишитесь опытные аноны. Но просьба без снобизма и поучительного тона. Просто напишите что в плюсах нужно задрачивать и почему, а что не стоит и почему.
Все что ты перечислил и нужно задрачивать. Точнее это база, которую должен знать каждый.
А как практиковать темплейты и потоки? Ну второе еще ладно, а вот с шаблонами вроде бы всё понятно, и сфинаешка, и трейты вроде бы не сложные, но где это применять в своих программах? Или это знания уровня устройства ОС или ассемблера, то есть просто для общего понимания?
Достаточно обширная тема, в двух словах ты не поймешь. В шаблонах Джоссатиса есть хорошее дополнение, я там более-менее понял, а так статей сотни.
В том же посте написал,
>Шаблоны С++ Справочник разработчика, 2-е издание
Вроде бы первое дополнение
Я не он и в метапрограммировании мало разбираюсь, но что мешает использовать tuple? Хотя наверное сам отвечу - там уже есть всё, что нужно.
В догонку спрошу, что поменялось между boost.mpl и boost.mp11? А между последним и hana? Собираться быстрее стало хоть?
Под винду лучше студии ничего нет и в обозримом будущем не будет. Особенно в плане отладки.
Say sike right now
>>67965
>>67969
Спасибо.
Для себя плюсы в плюсах я вижу в том, что я развиваю скилл программирования и перекат на любой другой язык будет максимально простым.
Вчера, например, я познакомился с кортежами, чтобы возвращать из функции два параметра, как в Матлабе.
Алсо, разбирает бугурт, когда какой-нибудь дноработник на работе спизданет типа "я пишу на с++", а на деле там очень хуевый си без классов, зато расширение файла цпп. Даже контейнеров нет, пиздец.
я не знаю для кого это пишу.
Сделай compile-time вычисление синуса с заданной точностью. Предполагается создание таблицы, но все на шаблонах
На самом деле, очень мало народа действительно может сказать, что знает С++, и писать не дырявую хуйню,а что-то вменяемое. Писать на C++ != знать С++, помни это
for(int i=0;i<newRows*newColumns;i++)
temp=mass;
delete mass;
mass = temp;
Мне надо создать новый массив, который будет меньше старого. Я правильно делаю?
Для эмакса ещё лисп выучить надо, а я только кресты учить начал.
> они связанны между собой
Никак они не связаны. Тебе нужен класс Image с методами setBitmap, getBitmap и save. Канвасу вообе не нужно знать что там есть какой-то ридер.
>что оба класса могут шарится по памяти друг друга
По другому никак. Естественно если ты не хочешь копировать куски памяти. Естесвенно в голый указатель никто не ебется и делается какая-то обертка над ним которая позволяет упорядочить работу с этим указателем. В библиотеках направленых на работу с openGL обычно идет разделение на три класса: Текстура - это то что ты называешь битмапом, "распакованая" картинка которая отсылается в память GPU, Изображение (Image) - изображение преднозначеное для чтения или сохранения на диск, обычно подразумевается какое-то сжатие (jpg, png) но не обязательно и Спрайт - легковесный класс для передачи ссылок на текстуру (или область на ней), есть в нем содержится указатель на текстуру и координаты района текстуры. Но такое деление продиктовано архитектурой GPU, в частности тем что пытаются максимально уменьшить количество обращений к карточке, в том числе всю графику (которая используется в какой-то одной сцене) собирают в несколько больших кусков (sprite sheet). Если ты полностью на CPU рисуешь то тебе возможно нет смысла заебываться с этим. Если волнует производительность то нужно думать в сторону кеша процессора - там наоборот будут выгодны относительно небольшие текстуры.
Меня ещё Ява бесила всегда, хоть и не работал никогда в этой сфере. Она ассоциируется с какими-то офисными чуханами нулевых. Бесит, блядь! Ебаный матлаб загружается на топ реке сутки нахуй
Спасибо за ответ.
Но если можно уточни пару моментов.
>Никак они не связаны. Тебе нужен класс Image с методами setBitmap, getBitmap и save. Канвасу вообе не нужно знать что там есть какой-то ридер.
Канвас и ридер у меня никак не связаны. Функционально. То-есть у них обоих есть по setBitmap, getBitmap, через них они обмениваются самой текстурой. Ридер может грузит и сейвить картинку. Канвас работает с картинкой. То-есть каждый занят своим делом.
Но! Меня сильно не устраивает то что для работы с картинкой мне нужно создавать два объекта разных классов, которые вообще никак идеологически не объеденные. Мне просто интересно есть ли како-то стандартный метод "идеологически" склеить их.
Вообще тут вопрос не в этом конкретном случае. Вместо канваса и ридера может быть все что угодно. Меня именно архитектура сейчас интересует.
Ну, другой пример. Пусть у меня будет 3Д-ридер. Который читает разные форматы 3Д моделей, переводит все это в некий "стандартный" формат и отдает его обработчику, который уже делает что-то там с вершинами. Asimp так устроен.
Собственно у меня вопрос как повторить такую архитектуру?
Думаю такая ситуация, которую я описал часто возникает. Как все это разруливаеться?
>Естесвенно в голый указатель никто не ебется и делается какая-то обертка над ним которая позволяет упорядочить работу с этим указателем.
Можешь чуть подробнее? Просто у меня сейчас как раз голый указатель передается. Скажи буквально пару слов.
Это для второго принципа SOLID: дополнение существующего без его изменения. Облегчает внесение правок с предсказуемыми последствиями, dependency injection и юнит тестирование.
>Ребята, поясните что это за новомодная поебень с "композицией вместо наследования"?
Если ты об этом вчера услышал, то скорее всего потому что ты отсталый даун, а не потому что это новомодная поебень.
Наследование тебе нужно для полиморфизма. Если тебе не нужен полиморфизм, тебе не нужно наследование.
>Наследование тебе нужно для полиморфизма
И для переиспользования кода.
Но использовать наследование для переиспользования кода нужно крайне осторожно. Так как тут очень легко выстрелить себе из дробовика в обе ноги и голову одновременно.
[] Эти
Этого не слушайте, он долбоёб.
Кстати что насчёт Eclipse?
> Скажи буквально пару слов
Ну вот у тебя передается указатель, и потом с ним что-то делается. Ты оборачиваешь указатель в класс и всю ту работу с ним пытаешся максимально перенести в этот класс-обертку. Чтобы работать с ним контроллируемым способом а не кто как захочет. Естественно у тебя графика, затратные по ресурсам операции и нужно искать компромисы - возможно все безопасн оне получится, из-за производительности.
>#pragma once
Эта ебань же вроде не входит в стандарт?
да, везде работает, но НА ВСЯКИЙ СЛУЧАЙ
>Как наследование способствует переиспользованию кода больше, чем композиция?
Я не утверждал что способствует больше. Я просто написал что наследование может использоваться и для переиспользовании кода.
Но если ты можешь переиспользовать код композицией, то выбирай композицию, а не наследование.
Вообще наследовать лучше всего интерфейс. С наследованием функционала могут повылезать всякие нехорошие проблемы потом.
Учти что ООП нужен именно для больших проектов. Если у тебя проект небольшой и ты не видишь куда там впихнуть наследование и прочию дичь то значит они тебе и не нужны. Обойдись без них. Используй классы чисто для инкапсуляции, как обертки.
Спасибо, за ответ, анон.
>Со всем, что не-ASCII, на Си/Плюсах лучше дела не иметь
А можно попробовать и получить àëëî éîáà ýòî òû
Поэтому отвечаю безадресно
Всем, которым непонятно, какой принцип ООП главнее какого другого.
Когда ты достаточно воспринял теорию, и надрочился в практике, у тебя возникает такая хуйня, как code smell.
Ты делаешь так-то, не потому что это отвечает принципам SOLID или "один класс - одна ответственность", а потому что ты жопой чувствуешь, то так и надо.
Т.е. это забеись, что у вас возникают эти глупые вопросы "а чому так?", но привыкните, что кроме вас на них никто не ответит.
Опыт приходит не с правильными ответами на дваче (да даже и на стэковерфлоу), а на порванной парой хуевых проектов жопе.
Стремитесь к этому, а не к абстрактному понимаю асбтрактных принципов.
>Опыт приходит не с правильными ответами на дваче (да даже и на стэковерфлоу), а на порванной парой хуевых проектов жопе.
На самом деле не приходит, потому что ООП является псевдоинтеллектуальной хуитой.
Я твою, псевдоинтелектуальную, маму в рот ебал.
>Учти что ООП нужен именно для больших проектов.
Никем еще не доказано, что ООП ускоряет или удешевляет разработку больших проектов. Что на маленьких, что на больших проектах проблема условно говоря одна -- разбиение сложной проблемы на более простые. Отсюда требование, чтобы разные компоненты программы работали как можно более независимо, чтобы разработка каждого компонента была относительно простой задачей. Но наследование не приводит к модульности, у тебя наоборот разные классы связываются между собой, ты уже не можешь поменять один класс, чтобы он гарантированно не уебал всех своих наследников.
Этого не происходит с интерфейсами, потому что интерфейсы никакого отношения к наследованию на самом деле не имеют, интерфейс это просто некая гарантия, что объекты данного типа могут быть аргументами для некоторых функций. Интерфейсы есть и в функциональных языках и к ООП никакого отношения не имеют, так нахуя тащить в язык целую свалку в виде ООП? Ради единственной полезной фичи, которая реализована через задний проход, и называется это умным словом "наследование"?
Ну давай так, гринтекст. Как много статей о критике ООП ты читал и что тебе в них не понравилось?
>статей
Лол.
Статьи не нужны, нужен код. Будет лучший, чем ООП, способ писать код - будем писать по другому.
>тормозная хуета, иногда в хуй не видит изменения в исходниках из-за чего приходится чистить вилкой весь проект
ООП не сводится к наследованию. Более того наследование лучше юзать чем меньше тем лучше.
Просто без ООП хуй ты более менее большой проект напишешь
Сводится. Инкапсуляция -- это синтаксический сахар, а без наследования нет полиморфизма.
>а без наследования нет полиморфизма.
Если речь не про тимплейты/дженерики, конечно, но они к ООП прямого отношения не имеют, это скорее элемент функциональщины.
Попробуй заглянуть в стандартную библиотеку
Приведи пример, когда полиморфизм в ООП реализован не через наследование. Интерфейсы в жабе -- это тоже про наследование, если что. Ad hoc полиморфизм по типу когда void func(int) и void func(double) считаются одной и той же функцией (методом) к ООП особ отношения не имеет. Тимплейты тоже. Все это можно сделать без ООП в языке типа Си.
Дженерики без наследования тоже особо работать не будут. Это просто указатель на Object (по аналогии с указателем void в C), но со статической проверкой типов. Т.е. оно все равно имплицитно использует тот факт, что все объекты в Java наследуются от Object. Плюс просто так дженерики без extends/super использовать особо не имеет смысла (иначе почему бы не делать все через Object по старинке), а это уже наследование.
Ок, уговорил.
Да вообще все идет по кругу. Когда я пришел в кодач, не понимал, че это все ООП хейтят. Теперь понял. Но объявилось новое поколение школоты. А я уже старый и мне даже спорить лень.
Хейт к ООП не столько из-за самого ООП, сколько из-за мифологизации ООП как таблетки от всех болезней, которая наконец то всех нас спасет от высокоуровнего ассемблера а ля Си. Объяснение ООП нужно начинать с объяснения полиморфизма, как и почему он работает. А объяснение полиморфизма нужно начинать с, сюрприз, теории типов. Потом нужно переходить к тому, что наследование в ООП -- это не более, чем способ реализации полиморфизма. Вместо этого студентам ебут мозг примерами про кошечек и собачек, которые наследуются от Mammal, в результате нихуя не понятно. И проблема не в примерах, потому что примеры могут быть вполне хорошими, а в том, что пример сам по себе объяснением не является.
Из-за этого флера недосказанности со стороны ООП выглядит как секта, где все поклоняются ООП, но никто не может объяснить, как это говно работает и почему оно выразительнее процедурного программирования. Оно действительно выразительнее процедурного программирования (если мы под процедурным программированием подразумеваем чистый Си), но адепт ООП тебе никогда не объяснит, почему, потому что тогда все очарование пропадет и адепт лишится объекта поклонения.
> Вместо этого студентам ебут мозг примерами про кошечек и собачек
А теория типов будет, значит, ясна человеку который учится программированию несколько недель?
Тем более всё запутает.
Значит надо давать больше реального кода на си, показать хотя бы препроцессорную компиляцию, передачу массив по констптр и, я хуй знает, контейнеры в с++. Это полезные вещи, которые хорошо займут время преподавания ООП.
мимо
> передачу массив по констптр и, я хуй знает, контейнеры в с++
Учим программированию или языку с++?
И тут мы приходим к закономерному выводу, что учить новичков сразу ООП нельзя.
Ну и тут надо понимать, что учить на мультипарадигменном языке, где ООП одна из парадигм != учить ООП. Программированию вполне можно учить и на С++, и на Python, просто давать информацию дозировано.
Уже не говоря о том, что учить программировать можно на языке без ООП, на C или на Scheme, например.
Тред про с++ ващето. Так что учим программированию на плюсах
>Уже не говоря о том, что учить программировать можно на языке без ООП, на C или на Scheme, например.
Да можно вообще учить программировать на ассемблере. А еще лучше - сразу в автокоде для МК-61, хуле.
Сортировка методом пузырька не сильно от этого изменится.
Учить ООП без наработанных на жопе мозолей от программирования без ООП, конечно, глуповато.
Я учился кодингу с создания карт для варика 3.
Там процедурное программирование. Чуть лучше чем в Си, конечно.
>Учить ООП без наработанных на жопе мозолей от программирования без ООП, конечно, глуповато.
Новичок не сможет нормально использовать ООП, если его учить сразу ООП. Тем более, что ООП не про алгоритмы и структуры данных, а про разработку полноценного софта, у которого есть как минимум ТЗ. Так что да, в идеале без наработанных на процедурном программировании мозолей к ООП вообще нельзя подпускать за километр.
Короче.
ООП это всего лишь инструмент.
Можно программить на яве, где любой кусок кода надо обернуть в класс, и не пользовать ни одной идеи из парадигмы ООП.
А можно и наоборот.
Когда ты знаешь, что кроме молотка и отвертки есть еще гаечный ключ, дрель и токарный станок, ты не пытаешься ЛЮБУЮ РАБОТУ делать молотком. Но когда тебе надо забить гвоздь, ты не пытаешься использовать для этого отвертку.
Я видел людей, которых начинали учить сраз в парадигме ООП.
Они и программу, которая умножает две константы, пытались делать на иерархии из 10-ти классов.
В общем, "хейт к ООП" существует только во влажных мечтах анона, особенно того, который херачит на яваскрипте.
Природа даже для дрочки дала две руки, какую выбрать - сам решай.
>особенно того, который херачит на яваскрипте.
ПЕРЕСТАНЬТЕ насмехатся над разными языками программирования
C быстрый
Java популярный
Ruby прикооольный
Python прекрасный
Javascript
Haskell интригующий
> Java популярный
Искренне желаю, что его популярность упадет и никто это говно не будет использовать. Андроид правильный шаг сделал
stl не разрабатывается, чтобы быть самым быстрым, а чтобы быть надёжным.
если тебе нужна скорость -- бери специально заточенные под это фреймворки или сам пиши
/th
На Котлин
>всего лишь инструмент
>что кроме молотка и отвертки есть еще гаечный ключ, дрель
Молоток, отвертка, гаечный ключ и дрель - все это стандартный набор инструментов, который доступен всем.
Тут подойдет другая аналогия.
Вот дядя Вася работал всю жизнь на буровой машине и благодаря своему опыту он может в некоторых случаях на своей буровой машине заменить экскаватор. Конечно, экскаватор с экскаваторщиком справился бы лучше.
Но дядя Вася не может просто так взять пойти в магазин и купить себе экскаватор. Не может он и в разумные сроки освоить управление экскаватором, тем более, что рабочий проект - не самая лучшая площадка для учебы.
Или еще лучше - посмотри на врача-хирурга. У него довольно много инструментов, но не менее важно, то что его набор также ограничен. Нету у него времени выбирать "идеальный".
>всего лишь инструмент
Подбирать "идеальный" инструмент на каждый пук - не самая лучшая стратегия.
Вон кладовщик на складе инструментов или продавец-консультант знает все обо всех инструментах. Кроме того, как ими собственно пользоваться.
Типа такого:
https://news.ycombinator.com/item?id=20159216
https://habr.com/ru/post/326540/
https://en.wikibooks.org/wiki/More_C++_Idioms
Банда четырёх это замечательно, но хотелось бы ещё чего-то. Скажем так, для каких-то небольших\локальных решений, а не на уровне всей иерархии системы или её частей.
С - самый простой и убогий язык из тех, что используются на практике.
Java - кобол нашего времени.
Ruby/Python - пыхоплеяда, высеры ГСМ-ов и неграмотных долбоебов, которые проделали большую работу изобретя квадратное колесо
Javascript - JavaScript
Haskell - язык программирования, менее вонючий чем все остальные, и от того нахуй никому не нужен.
Как же у человека в голове то насрано.
Впрочем он явно не кодит активно и судя по всему никогда и не будет, так что вреда особо не принесет.
Сука содомит
Нет, не угадал. И вреда разработке ПО, больше чем рандомная крестоблядь, принести довольно сложно.
Люблю кресты за то, что нужно рвать жопу, чтобы получать скромные по меркам любого другого стека зп.
Зарплата на 30% просядет, если снова на джуна устраиваться.
Перекатываться между языками не так просто, как кажется. Ты можешь выучить синтаксис, но овладеть соответсвующим языку стеком на уровене хотя бы мидла можно только практикой. В этом плане С++ один из самый простых, ибо кроме правил языка, хоть и бездонных, в нем ничего нет. Нет здоровенных фреймворков типа спринга, не надо ебаться с конфигами серверов и билд-систем, не надо держать в голове особенности разных GC и подбирать их под задачу, чтобы увеличить RPM. Поэтому неудивительно, что за кресты не так хорошо платят, ибо сложные вещи типа метапрограммирования все равно на практике применяются довольно редко, а обычные фичи аналогичны таковым в других языках и изучить их не такая уж и проблема.
Запахло несвежей копипастой..
> Нет здоровенных фреймворков типа спринга
Qt
>Поэтому неудивительно, что за кресты не так хорошо платят
Да чуть ли не каждой второй веб-макаке с 2-3 годами опыта платят больше, чем мидлосиньерам на крестах. Ведь, конечно же, на рынке платят за знания, а не за способность произвести прибыльный продукт.
> Qt
Десктоп-фронтенд на C++ не вписался в рыночек. А про веб ты прав, сегодня это намного прибыльнее крестов.
А где-то требуется знание всего boost от корки до корки?
По-моему такие требования из области тыжпрограммист.
Ну легаси эт понятно.
Но буст - это же десятки независимых библиотек под совершенно разные предметные области.
в вижуал студии + решарпер как полгода+ есть и то и то. Но ты, вероятно, хейтер
Конан оказался топчик, спасибо.
Это копия, сохраненная 4 октября 2019 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.