Вы видите копию треда, сохраненную 2 апреля 2021 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
⚹ https://github.com/sosachbot/cppthreadhat/wiki
Ответы на вопросы:
⚹ https://en.cppreference.com/w/
⚹ https://www.cplusplus.com/reference/
Для указателей: ⚹
Прошлый: >>1775527 (OP)
В переменной среды PATH добавлена папка. Из командной строки я могу их любой папки написав название файла запустить любую программу лежащую в ней. Хочу тоже самое в коде, чтобы он мог найти файл лежащий в этой папке
>папка. Из командной строки я могу
ну так забери PATH из энв варов и вперед проверять. Операционка делает именно так, С++ тут не причем.
в ШИНАПИ наверняка есть
>вместо того чтобы нормально сделать парсер даты, тупо брали два последних символа строки
Например как ты спарсить предлагаешь? 212022080115вав45203072220
На, вот строка тебе, парси хули, что последние джва символа это год
>Александреску
>>1795752 →
>Саттер
Еще Мейерс красаучик.
Труп страуса какой-то левый в этой компании, похоже, больше как популяризатор языка. Его базар не производит впечатление работы над реальными проектами.
И книги галимые по сравнению с Пратой.
Ну, буду перекатывать в следующий раз - запостю Мейерса, акей
юзани регулярку и не еби себе мозги, пчел
Посоны, как сконпелировать это: https://github.com/satorigold/SatoriGold
чтоб оно на винде не крошилось?
А то крошится, падла, crush, crush, crush, crush...
ПАМАГИТИ, кароч. АААААААААААА!!!!
На плюсах не писал уже 6 лет, как закончил универ. За свою карьеру перепробовал кучу экосистем с различного рода менеджерами пакетов: go get, mvn, sbt, pip, nvm — всё вот это дерьмо.
Есть ли что-то подобное для крестов, чтобы можно было просто объявить нужную зависимость, и чтобы билд система сама стянула всё, что нужно?
Сейчас conan популярен, но это чисто пакетный менеджер. Из билд систем с ним хорошо cmake интегрируется.
Нет, ничего нормального нет.
Индустрия как сидела на cmake, так и сидит.
Можешь покопать в сторону meson.
Из пакетных менеджеров vcpkg вроде относительно неплох.
Но сильно вкусно в любом случае не будет, билды/пакеты — не сильная сторона плюсов.
https://download.jetbrains.com/cpp/CLion-2020.1.3.tar.gz это последняя версия для которой работает кряк
а как же швабодка петухи коококо? Винду крякнуть скачать смс без регистрации мокрые писечки?
Будь последовательным - ебись с вимом
Ага, понял
>>796935
Дядь, что за наезд? Зачем ты мне предъявляешь за свободу? Где в моем посте хоть что-то про винду?
У меня есть чужой плюсовый проект с достаточно большим количеством LOC. Мне нужно этот проект отрефачить а затем накидать туда нового функционала. При этом cpp - не мой основной язык. По предыдущему опыту я знаю, что при работе с подобными проектами CodeBlocks (для меня) удобнее консоли, но сейчас заметил, что IDE от Intellij значительно удобнее CB.
Если ты считаешь, что в этом случае пойти ебаться с вимом - это последовательно, у меня для тебя плохие новости.
>>796977
Ай, блэт. И правда. Совсем забыл про вайн. Спасиб тебе.
Я точно помню что такая фича была где-то, просто сейчас не смог найти сходу.
Вкратце суть такова: если пилить оч.длинную конструкцию типа map<char, map<char, map<...>>> и заполнить её, то при удалении вылезает stackoverflow/segfault/еще какая дрянь.
Чтобы не быть голословным - вот очень простой код (25 строк, без выебонов): https://rextester.com/NBCLT14094
Если скопипастить его для clang/gcc, то всё отрабатывает без запинки, а вот с vc++ беда.
Проверил на своей VS19 (16.7.2) - то же самое. Есть ли идеи как с этим бороться?
Когда-то встречался с подобным, там мапа заполнялась макросом, который разворачивался в тысячу вызовов insert.
Решил заменой на try_emplace, хотя хз чем это тебе поможет
Если совсем худо будет, можешь увеличить размер стека. Видел такое в эмуляторе ps3
Наследоваться от std-контейнеров это уже занятие для рисковых пацанов. А уж если сверху полирнуть CRTP...
По f4 переключается у кют креатора, но такой фичи не помню, мож плагин? Или версия новее моей, я все ещё в 5.12.
Понял
> массивом
Пиздуй в си-тред. Тут мужики для такого либо std::array используют, либо std::vector
using arr_t = int[3];
arr_t& foo() {...}
Так вот как описать этот тип без using? int[3]& foo() выдает ошибку.
>Да это понятно, мне просто интересно во что раскрывается arr_t&.
https://cppinsights.io/lnk?code=YXV0byBmb28oKSAtPiBpbnQoJilbM107&insightsOptions=cpp17&std=cpp17&rev=1.0
незачем
Нажми на стрелку уже, или на Ctrl+Enter
Если правая часть выражения без труда позволяет определить тип, то можно, иначе лучше указать тип явно.
Да, даже нужно. Если не выводится, можно поставить сишное преобразование к желаемому типу перед выражением. Можно даже всегда его ставить для порядка, так сказать, альтернативный интересный синтаксис.
Надо во вторую скобку размер дописать, например int arr[][10]
Не пизди. Двум краснодипломникам месяц назад отказали, зато взяли паренька с неоконченным высшим. Он оказался гораздо сообразительнее первых двух.
Среда выполнения знает, сколько было выделено
>тайно
Хуяйно, зачем анону мозги пудришь? То, что ты написал, работает только в STL контейнерах (например, когда у тебя есть std::vector, там в классе есть метод size, который возвращает размер вектора, все метаданные о векторе хранятся в объекте класса std::vector).
Но если идет работа с сырыми указателями прямо как в Си, а он имел в виду именно это, то размер куска памяти в куче хранится в хедере метаданных удаляемого куска, а это целиком и полностью работа аллокатора памяти (ptmalloc3, jemalloc и т.п., есть дохуя реализаций), который к твоему коду не имеет никакого отношения, это отдельная подпрограмма, которая управляется отдельно операционной системой. Для простоты понимая - glibc в Линуксе, там среди всего прочего есть аллокатор памяти ptmalloc3, в нем ресурсы такого плана и находятся под управлением.
>размер куска памяти в куче хранится в хедере метаданных удаляемого куска, а это целиком и полностью работа аллокатора памяти
Именно это я и имел ввиду
Какая сейчас средняя рыночная зарплата на руки в ДС для C++ миддла? От чего вообще отталкиваться чтобы не продешевить? Опыт есть.
Так убери тогда шаблон если не использовал
100
Вставляет "ребра" из диапазона в дерево значений. Каждая итерация цикла внутри увеличивает "глубину" структуру на единицу.
>>797844
Виртуальность тут ни причем, я ж не наследуюсь ни от чего. Сделал виртуальным - ничо не поменялось
>>797633>>797647
Увеличение стека чуть помогло, но мне на вход по идее может придти строка хоть из мильона символов, а там необходимый размер должен уходить в небеса. Мне такую самодеятельность не зааппрувят. Похуй, поставлю ограничение на входящий размер строки.
Вообще основной вопрос был в том, почему другие компиляторы спокойно прожевали этот кусок, а msvc соснул. Раньше они бывало выдавали разные результаты для хитровыебанных случаев, но эксклюзивных крашей не было. Видимо надо перекатываться на clang.
На хабре было неплохое исследование по зарплатам в IT: https://habr.com/ru/company/habr_career/blog/485146/
Вот недавнее, но статистики меньше: https://habr.com/ru/article/511700/
По ощущениям реально в районе 110-130к.
Благодарю, примерная картина ясна.
А во что нужно вкатываться в 2020? Есть что-то столь же развитое в плане разработке оконных приложений?
Оконные приложения на С++ немного мертвы. Лишь 3.5 немца ебут труп. Если ты хочешь пилить - скорее вкатывайся либо в шарпы, либо в электрон
Лол, ты qml вообще видел? Современный интерфейс qt это не про кресты. Шарп/ксамль - говно, электрон похоже тоже, только мельком смотрел.
кро
Копипаст документации, нинужно
Легче чем с пайтон,тяжелее чем с Шарпа
Если в разных компиляторах разный результат, значит где-то стоит хитрый флаг или твой код UB или баг в конпеляторе
>я ж не наследуюсь ни от чего
А это что, блядь?
class ValueTreeTest : public std::map<T1, ValueTreeTest<T1, T2>>
И вообще, пожалуйста объясни, чего ты хотел добиться этой строчкой, я непонел.
Там хороший хелп, с туториалами и прочим, я на нем одном вкотился.
Ну понятно что наследование от мапы, но никаких приблуд при наследовании от stl-контейнеров сроду не вводил, всё работало.
>class ValueTreeTest : public std::map<T1, ValueTreeTest<T1, T2>>
>И вообще, пожалуйста объясни, чего ты хотел добиться этой строчкой, я непонел.
Шаблонный класс "m-ary tree" для поиска слов по дереву, ребра (T1) - char/wchar, значения (T2) - какие-нибудь инты. Поиск и прочую ерунду убрал, отставил только инициализацию (insert).
>где-то стоит хитрый флаг или твой код UB или баг в конпеляторе
Вот я и пытаюсь понять что за флаг там нужно поставить чтоб всё работало. Никакого UB нет, код рабочий на небольшом входе лет 10. Сейчас просто дошли руки до тестов на экстремальный вход и получилось вот такое.
Да хоть делай, хоть не делай - один хуй это говно вылезает в деструкторе https://rextester.com/GJXW94491.
Вместо использования примитивов синхронизации можно посылать на loopback (каждый поток слушает порт свой) пакеты. Какую-то я такую мысль читал.
Может кто-то подробнее этим интересовался?
Если у тебя есть шаредные данные - то тебе все равно нужна синхронизация
Блокироваться на мьютексе или блокироваться на чтении из сокета (хоть и локального)? Такое чувство, что второе будет намного оверхеднее.
Трассировщик лучей.
Интерпретатор языка Х.
Текстовый редактор.
Шахматы и змейки.
Клиент и сервер хуйни.
Эмулятор 6502.
яростно двачую насчет эмулятора, это один из лучших байтоебских проектов, по крайней мере в пространстве пользователя, не спускаясь в священное ядро, который только можно сделать.
>Трассировщик лучей
Если я полный нуб в линейной алгебре, есть ли смысл начинать с книжек вроде "3D Math Primer for Graphics and Game Development"?
На хабре была серия статей про самописный трассировщик на 200 строк кода
Как это всё подружить между собой?
Я сейчас собрал библиотеку, которая наполовину C90, частично С++11, а в нижних слоях два ассемблера (yasm и jwasm). Полёт нормальный, тесты прошли, ещё и модуль ядра соберу потом.
Правда, у меня все исходники были и версии gcc/g++ соответствуют, но, я думаю, в плане совместимости ты можешь это всё попытаться подружить.
(кроме сборки c++14 компилятором, не поддерживающим с++14).
Не понимаю, объясни
Фаерфолы и антивирусы могут начать возбуждаться на твою прогу, когда увидят открытый порт.
Вряд ли у меня получится слинковаться с проектом без исходников, собранным с c++98, если я начну собирать свой проект с c++11. Может быть написать обёртку над второй либой, обернуть там всё в extern "c" и продолжить писать на c++98? Есть у кого-нибудь опыт написания такого?
Спасибо
Вполне.
Есть старая pdf-ка, ищи по имени автора Roman Kuchkuda, там пошагово пишется простой трассировщик на си.
А хуё ево знает. Чем контора то занимается?
Стандарты пошерсти. Наверное будут вопросы про наследования и перегрузки функции при них.
Про структуры данных могу спросить: все эти списки, дек, очередь и тд. Может быть что-то про сложность алгоритмов.
Про универсальные ссылки и вообще move семантику.
Сложно так сразу сказать.
Информационной безопасностью занимается
Zecurion
Надень полосатые чулки
Потактовая точность в чимуляторе
Напиши тест:
Класс с конструктором копирования и конструктором перемещения. Запихни его в вектор. Перемести вектор. Если вызовется конструктор перемещения, то можешь не париться
Про это читал. На этом нюансы заканчиваются?
Сейчас работаю над библиотекой, которая всё равно собирается с -nostdlib.
Я не знаю. Пример привел потому, что это первый пришедший в голову способ проверить, что там по умолчанию задано. Полагаю, если noexcept == true, то и в остальных случаях тоже.
Симулятор - детально моделирует внутреннее устройство.
Эмулятор - только воспроизводит внешнюю работу АПИ, типа черный ящик.
Пример из жизни (писал эмуляторы 6502 по работе):
В старых играх программисты использовали разные трюки железа чтобы выжать производительность.
Эти особенности железа не всегда были описаны в документации, и зачастую открывались случайно экспериментальным образом.
В нескольких играх на эмуляторе не работала мигающая анимация заднего фона при атаках, взрывах.
Оказалось, что в эмуляторе, как по документации, выводилась строка пикселей целиком. В реальности же, программисты меняли содержимое строки во время ее вывода на экран, прямо пока бежал луч по кинескопу.
Для того, чтобы вывести правильный эффект, надо точно рассчитать, в какой именно момент произойдет смена пикселей в оперативной памяти. Тут бы помог симулятор, который обрабатывает команды по тактам и точно знает что происходило в чипах. Но считать все по тактам и пикселям очень долго, неприямлимо для реал-тайм эмуляции на 50-60фпс.
Подобные трюки были использовались и со звуковыми чипами. По документации один канал использовал рандом для шума. В эмуляторе это и будет просто рандом. Но в реале программисты изучили и поняли устройство чипа, на самом деле там счетчик со сдвигом, и научились "дергать" его в определенный момент времени, чтобы получить конкретный шумовой эффект для ударных. Без знания устройства эмулировать это не получится.
Для создания симулятора процессора, в частности, спилили крышечку чипа и он рассматривали его в микроскоп, чтобы воспроизвести детальную работу логических элементов. В частности, таким образом через 30 лет разгадали загадку, почему одна недокументированная команда процессора работала на некоторых партиях компьютеров, а на других зависала. (а на третьих зависила от того, насколько компьютер прогрелся, буквально). После чего, даже разобрались, по каким адресам памяти ее можно располагать, чтобы она работала стабильно. В эмуляторе, без этих симуляторных знаний, у тебя были бы только документированные команды, а для недокументированных у тебя была бы просто заглушка, которая могла, к примеру, выводить ошибку, или игнорироваться.
Симулятор - детально моделирует внутреннее устройство.
Эмулятор - только воспроизводит внешнюю работу АПИ, типа черный ящик.
Пример из жизни (писал эмуляторы 6502 по работе):
В старых играх программисты использовали разные трюки железа чтобы выжать производительность.
Эти особенности железа не всегда были описаны в документации, и зачастую открывались случайно экспериментальным образом.
В нескольких играх на эмуляторе не работала мигающая анимация заднего фона при атаках, взрывах.
Оказалось, что в эмуляторе, как по документации, выводилась строка пикселей целиком. В реальности же, программисты меняли содержимое строки во время ее вывода на экран, прямо пока бежал луч по кинескопу.
Для того, чтобы вывести правильный эффект, надо точно рассчитать, в какой именно момент произойдет смена пикселей в оперативной памяти. Тут бы помог симулятор, который обрабатывает команды по тактам и точно знает что происходило в чипах. Но считать все по тактам и пикселям очень долго, неприямлимо для реал-тайм эмуляции на 50-60фпс.
Подобные трюки были использовались и со звуковыми чипами. По документации один канал использовал рандом для шума. В эмуляторе это и будет просто рандом. Но в реале программисты изучили и поняли устройство чипа, на самом деле там счетчик со сдвигом, и научились "дергать" его в определенный момент времени, чтобы получить конкретный шумовой эффект для ударных. Без знания устройства эмулировать это не получится.
Для создания симулятора процессора, в частности, спилили крышечку чипа и он рассматривали его в микроскоп, чтобы воспроизвести детальную работу логических элементов. В частности, таким образом через 30 лет разгадали загадку, почему одна недокументированная команда процессора работала на некоторых партиях компьютеров, а на других зависала. (а на третьих зависила от того, насколько компьютер прогрелся, буквально). После чего, даже разобрались, по каким адресам памяти ее можно располагать, чтобы она работала стабильно. В эмуляторе, без этих симуляторных знаний, у тебя были бы только документированные команды, а для недокументированных у тебя была бы просто заглушка, которая могла, к примеру, выводить ошибку, или игнорироваться.
На завод или в оборонной КБ или НИИ попробуй. Будешь всякое технологическое говно писать сначала, там же и диплом сделаешь.
Базовый вопрос, который меня спрашивали НА КАЖДОМ собесе на миддла по плюсам: чем std::map отличается от std::unordered_map, начиная от реализации и заканчивая сложность поиска, удаления и вставки. Заучи так, чтобы проснувшись посреди ночи мог на него сразу ответить!
А так должны спросить по сортировки и их сложность, стандартные контейнеры вроде вектора/листа, основы ООП перечислить, скорее всего будет пара базовых вопросов по темплейтам и виртуальным функциям, статическим переменным и их особенностям, аллокация на стеке/куче и прочие заковыристые места языка (но сношать тебя по ним не должны, тут скорее просто знаю-не знаю). Может задачку с литкода дадут или SQL запрос небольшой попросят написать, у всех по разному. Но map спрашивали вообще везде, так что первым делом учи STL контейнеры.
посоветуйте книгу по c++ и stl. до этого я как-то без этого обходился но на собеседование оч нужно, в шапке непонятно
Всё просто. Язык C есть везде, на всех платформах, под все процессоры и ОС. Он одинаков, прост, быстро работает.
С++ же не столь универсален. Не все фичи везде доступны, где-то даже компилятора не найти.
В общем, подлинно портируемые программы стараются писать на C. Тогда они заработают на любом утюге.
Правда ли, что язык сдувается? Что вакансий всё меньше, а зарплаты уступают разработчикам на других языках?
Не лучше ли вместо всех премудростей плюсов, просто проштудировать Java и идти грести бабло?
>Для создания симулятора процессора, в частности, спилили крышечку чипа и он рассматривали его в микроскоп, чтобы воспроизвести детальную работу логических элементов.
Какие-то сказки венского леса. Интересно, сколько они положили сил, времени и денег на это "спиливание крышечки и изучение"?
Ради чего такие заморочки? Ради парочки глючных игр? Да ещё 30 лет спустя. Кому это понадобилось?
И да. Засунь свою доморощенную терминологию в задницу. Меня как-то не ипёт это твоё деление на "симуляторы" и "эмуляторы".
Откуда ты это притащил? Каждый гандон будет изобретать термины и тонкий их смысл, а все остальные должны послушно всё это жрать.
Если что, могу ещё сообщить шта эмулировать ньюансы работы электроники - это не хуй собачий. Имею скромный опыт разработки цифровой схемы. На симуляторе её логики (на уровне вентилей) она ведёт себя не вполне так, как вживую в железе.
В симуляторе все относительно прямо и просто. А в железе вылезают косяки. Воспроизвести это программно совсем не просто.
Относительно других языков - вполне. Говорят, сейчас на плюсах нужно работать в нишевых областях, где требуется высокая квалификация, дабы прилично зарабатывать.
Плюсы сдали поляну языкам, на которых писать код проще и быстрее (не код быстрее, а производительность программиста выше).
Посмотрите -- даже в геймдеве, традиционной поляне C++, Unity использует C#.
Что на чём вертится не так важно, эти фундаментальные вещи не занимают большой доли рынка.
Впрочем я не говорю про примитивные задачи, которыми занимаются толпы кодомакак. Клепание сайтиков на PHP каком-нибудь.
Я про языки и области применения с оптимальным соотношением профит/усилия_на_изучение.
Можно ещё софтвер-рендерер или 3D игру, вместо трассировщика.
Впрочем, если это не по зубам, можно и 2D игру. Изометрическую какую-нибудь. Стратегию, например.
>сырыми указателями
Сыро только у твоей мамки в трусах, анон. Raw pointers переводится как "голые указатели".
Это общепринятые термины, маня. Можешь погуглить.
Это сделали демосценеры, потому что охуевали с мистики почему у одного работает а у другого нет, а компов у них и так навалом. А фанатов у 6502 полно, комьюнити огромное, очень уж удачный проц был. До сих пор под него игры каждый год выходят.
>производительность программиста выше
Там где нужна производительность и в плане скорости работы программы и в плане скорости написания програм возьму реального профессионала.
Но ладно, не отрицаю что зачастую прототипы програм пишут на других языках, тру.
>даже в геймдеве
Ни один ААА проект не станет использовать юнити и шарп в качестве инструментов. Даже при современных идиотских стандартах.
>эти фундаментальные вещи не занимают большой доли рынка
Архитектуры x64 и arm самые распространённые в мире на сегодняшний день. Весь лоулевельный софт для взаимодействия остальной системы с ними написан на чистом С или порой на С++. Это львиная доля рынка и пока не будет готов полностью рабочий квантовый компьютер тут и говорить нечего.
>с оптимальным соотношением профит/усилия_на_изучение
JS макаки радуются 120к в месяц в лучшем случае, люди с реальными знаниями и страстью к технологиям уезжают в Германию/Калифорнию/Канаду.
Плюсы начали сдуваться в начале 200х, сейчас их положение стабильно, они остались там, где нужны и заменить их нечем.
Экстремальное байтоёбство сейчас на Zig модно писать. Это по сути обёртка на LLVM с кучей сахара. Крестовики обзавидуются местным чудесам синтаксиса.
Ну если ты на программиста учился чтобы по итогу текстовые редакторы делать - то да, вполне.
Человеку с 4 годами опыта (если там опыт какой-то есть конечно) программирования это задача на 2 вечера.
Шрифты и поиск? Ахаха, удачи. Ну естественно если речь не идет о вставить готовый компонент типа RichEdit.
Если использовать готовые либы то да, за 2 вечера можно взять какой-нибудь imgui и юзать просто textbox. С нуля даже просто отрисовку текста пиздец как сложно сделать.
>>803470
Сомневаюсь, что тебе в вузе разрешат такое брать на диплом. Я вот тоже хотел на плюсах что-то низкоуровневое на дипломе писать, так меня нахуй послали и сказали "А КАК ЭТА МОЖНА ИСПОЛЬЗАВАТЬ В БИЗНЕСЕ??7" ну и пошел делать сайт на шарпе...
У меня на работе один чувак называет их "лысыми указателями"
Ничего страшного, малыш. Если попробуешь отрендерить шрифт со всеми нюансами выключки, скейлинга, кернинга, трекинга, сглаживания, прокрутки без глюков, немного собьешь спесь, может за полгодика научишься рисовать что-то более менее сносное.
Я тебе уже всё сказал - суметь скопировать нотпад это тир 5 навык. С таким подходом ты один хуй через полгода-год перекатишься в веб.
Ну ок, для такого маэстро как ты не составит труда показать легкость тир5, сейчас как выходные будут, значит сможешь сделать такую легкую вещь как копия нотпада за вечер, верно? Ты же не пустозвонный тролль.
Какая связь между временем на реализацию, и временем на то, сколько нужно учить компьютерные науки, чтобы уметь это написать?
А главное, причем тут опыт (который нарабатывается в коммерческих компаниях) и академическое обучение?
Забей, это троль(малолетний дебил) категории /math.
Точно не изобретение жигуля и претензия на то, что это ауди.
>>803547
Обязательно. Ты ещё методичку скинь, я тебе и диплом с 0 напишу. О, и адрес, адрес тоже. Я тебе свою тян пришлю, поебёшься на халяву.
>>803550
В условиях постсоветского ущербного образования - связи никакой. В то время как в Европе и Северной Америке 4 года обучения выдают абсолютно готовых к комерческой деятельности спецов методички Священной в лучшем случае к 4 курсу высрут человека способного выёбываться умением в рендеринг текста. Плюсом идёт всеобщее ебланство, но об этом даже говорить не приходится.
class Alpha {
Alpha(const Alpha& a){/.../}
};
Какие члены класса в данном случае будут автоматически определены при создании класса?
Ответьте пожалуйста.
Я тупой бака.
>4 года обучения выдают абсолютно готовых к комерческой деятельности спецов
Ну то есть это уровень ПТУ, а не Вузов, которые должны давать научные знания, понятно.
Ясно, и тян у тебя есть, угу, и $13к, совсем не тролль. А блокнот написать не можешь. Вся суть выебывальшиков-наебщиков.
>>803470
Вот тебе пример тем дипломов из моей шараги. Мб что-то подойдет
«Разработка стохастического метода оптимизации на основе механической аналогии»
«Анализ вариабельности сердечного ритма»
«Модификация комплекса ПА9»
«Создание платформы для локального развертывания клиентской части веб-приложений»
«Разработка клиентской части информационной системы по организации гоночных такси»
«Модельно-ориентированное проектирование в основе программирования логических интегральных схем»
«Исследование многосеточных методов решения систем линейных алгебраических уравнений»
«Разработка модуля экспорта для системы проектирования калибров для профилегибочного производства»
«Разработка витрины интеллектуального анализа данных биржевых операций»
«Исследование режимов максимальной и минимальной диссипации механической энергии в простейших силовых сетях методами математического моделирования»
«Динамический и прочностной анализ робота-манипулятора»
«Разработка программной реализации удаленного запуска графоориентированных решателей систем инженерного анализа»
«Разработка хранилища данных для анализа биржевых операций»
«Разработка приложения для организации бизнес-процессов проектирования ПО»
«Оптимизация хранения медицинских данных на основе использования технологии блокчейн»
«Численное моделирование движения многосекционного бурильного инструмента внутри скважины»
«Разработка системы детектирования дороги для мобильного робота»
«Разработка информационной системы автоматизированного доступа к онлайн-сервису товаров и услуг»
«Разработка безопасного генератора случайных чисел в блокчейне»
«Разработка серверной части информационной системы для заказа скоростного такси»
«Разработка мобильной части программно-аппаратной системы голосового управления транспортным средством»
«Модельно-ориентированное проектирование в основе программирования микроконтроллеров»
«Разработка NX приложения для редактирования размерных цепей в ТУ»
«Использование концепций создания пользовательского интерфейса для кроссплатформенных приложений на основе UX-исследований»
«Разработка Web-ориентированных CASE инструментариев для автоматизации генерации объектов на основе шаблонов»
«Разработка пользовательского интерфейса инвестиционной игры с использованием Unreal Engine 4»
«Исследование масштабируемости работы серверного программного обеспечения в «облачной» инфраструктуре»
«Разработка редактора нейтрального слоя профилей для системы проектирования калибров профилегибочного производства»
«Разработка подсистемы структурного анализа сложных изделий»
«Разработка аналитической подсистемы для исследования банковских операций юридических лиц»
«Разработка web-ориентированных CASE инструментариев автоматизации построения исходных кодов графоориентированных решателей»
«Разработка нейросетевого ансамбля для прогнозирования банкротства ресурсоснабжающих предприятий»
«Разработка автоматизированной системы поддержки трейдинга»
«Разработка WEB-аналитической подсистемы исследования цифровых биологических сигналов»
«Разработка редактора профиля для системы проектирования калибров профилегибочного производства»
«Разработка подсистемы визуализации для системы проектирования калибров для профилегибочного производства»
(хвост по КП за прошлый семестр) «Разработка математической модели амортизатора самолета для комплекса ПА9»
«Разработка системы автоматизированного проектирования приложений среды ROS»
«Исследование распределения статического заряда по поверхности проводящего тела»
«Разработка программного комплекса для линеаризации избыточных механических структур»
«Разработка архитектуры и реализация программного комплекса оптимизации робототехнических приложений»
«Разработка веб-приложения для визуализации многомерных данных»
«Анализ конечно-элементной сетки в приповерхностном слое изделия, усиленного «наклепом»
«Динамический и прочностной анализ элементов механизма перекоса винта вертолета»
«Машинное обучение на основе непрерывных динамичечких систем»
«Реконструкция эффективных кривых деформирования ПКМ на основе аппроксимации кривых деформирования отдельных компонентов ПКМ»
«Разработка информационной системы балансирующего рынка электроэнергии»
«Разработка модели деформации листовой заготовки при формовке роликами в системе LS DYNA»
«Разработка web-приложения для визуализации многомерных дан-ных»
«Исследование динамики контактных сил в неконсервативных упругих системах»
«Разработка эффективного алгоритма поиска с возвратом на основе эвристик»
«Разработка распределенного комплекса дистрибуции программного обеспечения»
>>803470
Вот тебе пример тем дипломов из моей шараги. Мб что-то подойдет
«Разработка стохастического метода оптимизации на основе механической аналогии»
«Анализ вариабельности сердечного ритма»
«Модификация комплекса ПА9»
«Создание платформы для локального развертывания клиентской части веб-приложений»
«Разработка клиентской части информационной системы по организации гоночных такси»
«Модельно-ориентированное проектирование в основе программирования логических интегральных схем»
«Исследование многосеточных методов решения систем линейных алгебраических уравнений»
«Разработка модуля экспорта для системы проектирования калибров для профилегибочного производства»
«Разработка витрины интеллектуального анализа данных биржевых операций»
«Исследование режимов максимальной и минимальной диссипации механической энергии в простейших силовых сетях методами математического моделирования»
«Динамический и прочностной анализ робота-манипулятора»
«Разработка программной реализации удаленного запуска графоориентированных решателей систем инженерного анализа»
«Разработка хранилища данных для анализа биржевых операций»
«Разработка приложения для организации бизнес-процессов проектирования ПО»
«Оптимизация хранения медицинских данных на основе использования технологии блокчейн»
«Численное моделирование движения многосекционного бурильного инструмента внутри скважины»
«Разработка системы детектирования дороги для мобильного робота»
«Разработка информационной системы автоматизированного доступа к онлайн-сервису товаров и услуг»
«Разработка безопасного генератора случайных чисел в блокчейне»
«Разработка серверной части информационной системы для заказа скоростного такси»
«Разработка мобильной части программно-аппаратной системы голосового управления транспортным средством»
«Модельно-ориентированное проектирование в основе программирования микроконтроллеров»
«Разработка NX приложения для редактирования размерных цепей в ТУ»
«Использование концепций создания пользовательского интерфейса для кроссплатформенных приложений на основе UX-исследований»
«Разработка Web-ориентированных CASE инструментариев для автоматизации генерации объектов на основе шаблонов»
«Разработка пользовательского интерфейса инвестиционной игры с использованием Unreal Engine 4»
«Исследование масштабируемости работы серверного программного обеспечения в «облачной» инфраструктуре»
«Разработка редактора нейтрального слоя профилей для системы проектирования калибров профилегибочного производства»
«Разработка подсистемы структурного анализа сложных изделий»
«Разработка аналитической подсистемы для исследования банковских операций юридических лиц»
«Разработка web-ориентированных CASE инструментариев автоматизации построения исходных кодов графоориентированных решателей»
«Разработка нейросетевого ансамбля для прогнозирования банкротства ресурсоснабжающих предприятий»
«Разработка автоматизированной системы поддержки трейдинга»
«Разработка WEB-аналитической подсистемы исследования цифровых биологических сигналов»
«Разработка редактора профиля для системы проектирования калибров профилегибочного производства»
«Разработка подсистемы визуализации для системы проектирования калибров для профилегибочного производства»
(хвост по КП за прошлый семестр) «Разработка математической модели амортизатора самолета для комплекса ПА9»
«Разработка системы автоматизированного проектирования приложений среды ROS»
«Исследование распределения статического заряда по поверхности проводящего тела»
«Разработка программного комплекса для линеаризации избыточных механических структур»
«Разработка архитектуры и реализация программного комплекса оптимизации робототехнических приложений»
«Разработка веб-приложения для визуализации многомерных данных»
«Анализ конечно-элементной сетки в приповерхностном слое изделия, усиленного «наклепом»
«Динамический и прочностной анализ элементов механизма перекоса винта вертолета»
«Машинное обучение на основе непрерывных динамичечких систем»
«Реконструкция эффективных кривых деформирования ПКМ на основе аппроксимации кривых деформирования отдельных компонентов ПКМ»
«Разработка информационной системы балансирующего рынка электроэнергии»
«Разработка модели деформации листовой заготовки при формовке роликами в системе LS DYNA»
«Разработка web-приложения для визуализации многомерных дан-ных»
«Исследование динамики контактных сил в неконсервативных упругих системах»
«Разработка эффективного алгоритма поиска с возвратом на основе эвристик»
«Разработка распределенного комплекса дистрибуции программного обеспечения»
Вроде бы деструктор всегда, копи конструктор потому что класс простой, все остальное отключено явным конкструктором копирования. Могу ошибаться, я не эксперд в стандарте.
Ой, блин, я имел в виду деструктор и оператор копирования.
> «Разработка редактора профиля для системы проектирования калибров профилегибочного производства»
А вообще одна хуйня типа посчитать говно по формуле. Вообще не программирование. Зато лохчейны порадовали, но вот там реально на 2 вечера работы.
>«Разработка редактора профиля для системы проектирования калибров профилегибочного производства»
Так при чём тут текстовый редактор со шрифтами, поиском редактированием?
на как не нужно - "движок" то все равно придется на си или крестах писать
но нужен быстродействующий высокоуровневый скриптовый язык, он должен лежать в основе любого редактора
что больше всего бесит в емаксе и виме? - это емакслисп и вимскрипт
бесит просто до зубовного скрежета
но коммьюнити вложило в эти редакторы миллионы человеко-часов, и все продолжают стонать и писать на этих хуевых скриптовых расширениях
>стонать и писать на этих хуевых скриптовых расширениях
Для авторов может и да, а у меня они просто работают, стонать не приходится.
(не отрицаю их хуёвость).
>смежного
Действительно, ты же аутист.
А это тоже не смежное?
>Использование концепций создания пользовательского интерфейса для кроссплатформенных приложений на основе UX-исследований
>Разработка web-приложения для визуализации многомерных дан-ных
Это еще в разы проще.
Это становится всё менее смешным. Если 1 ещё можно хоть как-то притянуть то каким образом здесь клеится веб приложение с визуализацией?
Что учить после шаблонов и контейнеров?
Задачки которые в унике дают делаю. А если делать свой проект то на матан времени не хватит. Думаю забить хуй на задачки уника и делать что-то своё, тупа списывая у одногруппов дз
В реальной работе матан нахуй никому не нужен, кроме машинлернеров и дата сатанистов. Даже обидно, что на него тратить время надо.
Но тем не менее - читай книги по всякому С++20 и старайся писать код
Я тебя понял. Отвечаю последний раз и ухожу на работу а ты продолжаешь троллить своей тупостью других.
>визуализации
Не принта, а именно визуализации
>многомерных дан-ных
Это могут быть данные любого вида. Что подразумевает что текстового вывода здесь может вовсе не быть
В подобного рода проектах тебе нужно будет реализовать оптимизацию быстродействия и защиту от битых данных/устранение шумов etc. а не ебаться со шрифтами.
Я хуй знает на кого ты учишься. Я системный программист, опыта пошел 7ой год. Никакая математика не пригождалась ниразу.
>отрендерить шрифт со всеми нюансами выключки, скейлинга, кернинга, трекинга, сглаживания, прокрутки без глюков
ага, а потом понимаешь что это все костыли-костылики
а идеал это растровый шрифт + система с выстовленным ppi==dpi (и да, винда тут уже не подходит)
Ты считаешь что в шрифтах не надо ебаться с быстродействием? Лол, я понимаю если бы мы сидели в js треде, но в с++ такие перлы выдавать это конечно лол.
Я бы на защите спросил а зачем миру ещё один редактор ?
А команды TECO вы знаете, молодой человек?
И оглядывайся на примеры (хорошего) кода. Почитай, как другие люди пишут. Передирай у них удачные моменты. Как они оформляют код, как его организуют, как устроены и работают программы.
Вот можно поковырять исходники:
- Библиотека xerces-c. Это XML парсер. Очень чисто написана.
- Стандартная библиотека, которая прилагается к твоему компилятору. Поковыряй, как там написаны контейнеры, например.
- Исходники игр, игровых движков. Doom 2, Doom 3, Unreal
- Исходники всякого софта, вроде Linux, FreeBSD, Libre Office, Apache, Chromium Browser
Разработай свой собственный styleguide для того кода, что ты сам пишешь.
Как же меня рожа этого Александреску на первой картинке бесит. Так и хочется в неё кирпичом запульнуть. Ну почему программисты сплошь и рядом выглядят не как фотомодели?
>примеры (хорошего) кода
>Стандартная библиотека, которая прилагается к твоему компилятору
Ебанутый?
Там же тысячи строк #ifdef __CXX_EXPERIMENTAL_CXX0X__ костылей под разные версии крестов/архитектуры/ОС с __gnu_debug_std::__М_такими_именами_переменных___ и мудацким форматированием пробелами пополам с табами.
Потому что большая часть перечисленного касается больше расстановки буковок, какими бы они не были (растер/вектор). А если масштабировать шрифт (растр то у тебя под 1 размер будет), то и со сглаживанием тоже возиться.
Это ты еще ролевиков-настольщиков не видел.
Вот есть типа определение
template<class...> void foo();
вот специализации для пустого и непустого списка типов
template<> void foo<>() { cout << ".\n"; }
template<class T, class... Ts>
void foo<T, Ts...>()
{
cout << typeid(T).name() << " ";
foo<Ts...>();
}
Но оно во-первых не компилится, а во-вторых определяется как перегрузки, а не специализации. Где я проебался?
Само собой. Я, конечно же, говорил о работающих в не-текстовых режимах.
Вроде бы template void foo<T, TS...>()
Нуу. Пусть это не хороший код, но тоже экспириенс на тему "вот так тоже бывает". Разве не интересно, как устроены и работают вот эти самые контейнеры, про которых столько говорилось?
У нас опенспейс, и мне приходится буквально целыми днями просиживать, вперясь в ебло соседа-программиста. И кодить-кодить-кодить. Не видя ничего кроме компа и офиса.
Уже не уверен, правильно ли я выбрал профессию. Вон - адвокаты. Постоянно какая-то драма, люди всякие, интересные случаи, поездки, трепаться надо. А тут што?
Потому что кодить надо для души и себя, а работы в ИТ кроме кодинга полно. Я вот хожу на работу, пью чай, скролю двачи и попутно запускаю скрипты на PowerShell, которые делают почти всю работу за меня. А платят как местным макакам, которые по 12 часов сидят за мониторами и не могут даже пернуть. Ещё и ходят на работу по СКУДу, повинуясь бездушной машине, считающей их часы и опоздания.
>суметь скопировать нотпад это тир 5 навык.
Лолват. Тир 5 пять это window gdi, функции отрисовки которого дёргает нотепад.
Ещё одна трабла - преимущественно мужской коллектив. Что в инсте одни мужики, что на работе. Где-б няшных тяночек найти? Меня от мужиков уже воротит.
Особенно на работе. В инсте все молодые, а тут какой-то мрак.
> Исходники всякого софта, вроде Linux, FreeBSD
Хочется почитать исходники разного ПО, но вот без навигации по вызовам функции, подсветка используемых переменных и прочего крайне не просто.
Какой редактор может просто "сожрать" папку с исходниками по которым хоть как-то можно будет перемещаться?
Закинь в cpp insights и посмотри
Да хуй ты там разберёшься без 0.5
На джаве в разы больше почему-то.
Недавно листал, довольно много вакансий.
Правда, я не джунов листал.
А хуле ты хотел?
На джаве больше вакансий по всему спектру скилла, да.
не, я так подогнал чтобы без масштабирования были, чтобы чисто точка в пиксель горела
Пару задачек на логику придумай, спроси про современне фишки языка - чтобы не шарахались от твоего проекта. Указатели умные; попросить записать из двух потоков в один ресурс; виртуальный деструктор; мув-семантика; crtp, специализация шаблонов;
Спроси, читал ли он/она какие-нибудь книги и что оттуда вынесли.
Ну и правило номер ноль: если от кандидата воняет, то с собеседованием нужно не затягивать.
Эти два сообщения в любом случае попадут в один буфер сокета. Даже если ты как-нибудь сумеешь разделить их при отправке, со стороны приема всё в один буфер улетит.
Можешь сначала посылать пару байтов, сигнализирующих, что это команда либо данные. Потом размер команды\данных. А после уже данные согласно размеру.
Спасибо. Раньше никогда не писал чего то большого. Обычно задачи какие нибудь решал или редко что то для себя. Там обычно так: есть идея, чуть обдумал, может на листике че то написал и записал на компе. Тут блин нужно сначала продумать заранее как оно все будет работать, а потом писать, иначе хуйня получится
я бы выбрал уже существующий протокол обмена (бинарный или текстовый) и использовал его
либо бы готовую реализацию, либо, если бы захотелось велосипедостроения, то сделал бы сам по существующим спекам
но даже второе не советую
а "проектировать" свой протокол это надо очень умным и опытным быть
раз ты задаешь такие вопросы, ты явно не из тех ребят
> Эти два сообщения в любом случае попадут в один буфер сокета.
Как будет время я это на компе проверю . Да и вообще уточню как boost данные обрабатывает, но вопрос тогда. Раз сообщения с любом случае попадут в один буфер, то как тогда данные скачивают большие. Программы не хранят же в буфере 10гб игры. Скачали кусок, очистили буфер. Как я понимаю. Ну я по идее тоже так смогу. Ну и так буду разделять сообщения
да ладно
В заголовке сообщения передаешь метаданные (ID команды, бла-бла), затем в теле сообщения сами данные. Отправляешь как единое целое.
по отзывам - книга максимальная хуета, или для сойдёт?
Ну изучатели буста это отдельная секта, солидарен. Но ТУРБО мать его СИ. Серьезно. Даже в 2010 это был лол кек чебурек. А уже в 2020 подавно.
На самом деле не важно.
Ну, то есть, понятное дело, что книга говно. Как и Turbo C.
Но я не думаю, что это как-то должно сильно мешать. Всё равно нужно дохуя самому изучать, использовать разные нормальные компиляторы, читать статьи, ковырять стандартную библиотеку, пробежаться по хотя бы одной обзорной книге, разобраться в отличиях между стандартами.
А в каком там виде вам будут хеллоу-ворлды демонстрировать — на мой взгляд без разницы.
>>804455
Да, к остальному не придираюсь, очень смешно.
ебаться самому и придётся, да, похуй, чего не сделаешь ради вылеза из говен не спиться бы в общаге, лол
Я по страуструпу в свое время выучил со статьями по отдельным непонятным темам. Вроде даже хорошо получилось.
Ты вызов read() видел? Ты ему задашь считать 10ГБ, а функция вернет что считал, например, 1 Мб. По хорошему ты её в цикле вызываешь, до тех пор, пока все данные не будут считаны. Параллельно, при достижении определенного размера буфера, пишешь в файл, чтобы не держать всё в оперативке.
std::test
[/code]
Так себе С или С++?
Для С есть другой тред, в конце концов бери Кернигана и Ричи. Тоненькая книжечка просто и лаконично описывает язык.
Для С++ Липпман и Прата, Шилд ещё (синенькая такая кажется, в чём-то устарела наверняка, но для примитивного уровня достаточно)
Собираешь в достаточно большом буфере команду фиксированной длины, длину данных и данные, сколько влезет. Пишешь в сокет. Продолжаешь писать остаток данных.
Прошу советов как это можно дебажить.
Есть ли какая-нибудь прога чтоб туда логи сырой памяти структуры вставить и ее описание и посмотреть как со временем значения в этой структуре менялись? (околориалтайм и взаимодействие с несколькими железками, брейкпоинт в студии только 1 раз поставить можно, после всё собьётся и перезапуск и всё чуть по другому будет)
Для начала пройдись статическими анализаторами, например clang-tidy.
Потом прикрути формирование дампов, узнаешь хоть, где вылет происходит.
Напиши пару тестов на предполагаемые методы. Введи логирование входных/выходных данных.
Поиграйся с брейкпойнтами в студии: им можно задавать условия или смотреть количество срабатываний без остановки программы.
> большая прога
> ~3 МБ исходников
Лол
Хотя можно наверное и оставлять дублткаты. Возможно ничего страшного не случится, если будут созданы 2 одинковые карты. Единственный мнус в том, что когда пользователь будет потом искать карты, он может найти две одинаковых. хотя можно будет вручную такое отслеживать переодически, в моменты, когда сервер не нагружен и дубликаты сливать в один элемент.
>Для начала пройдись статическими анализаторами
PVS Studio юзаю, оно норм?
>прикрути формирование дампов
Как правильно это сделать, чтобы
>узнаешь хоть, где вылет
если они в рандомных местах
>Напиши пару тестов
Почти вся прога - симуляция физических процессов, написана давно не нами, вообще хз что там внутри происходит (принимает структуру 1000+ полей)
>Введи логирование входных/выходных данных
Вот я и хочу с минимальной болью это сделать, сохранять ту структуру на каждом такте работы, что может её потом из лога в виде дерева показать как в отладчике студии?
>Брейкпоинты, задавать условия
Уже мало помогает
>>804737
>шланг
?? это clang?
На с++ полгода, на 800 строк максимум проги делал, для меня пиздец большая
Помогите студню-дебилу
Из навыков программиста обладаю только умением гуглить поэтому нашёл решение своей задачи на спп
Проблема такая - возможно ли перевести это решение на python или pascalABC.net? я НЕ прошу переводить просто подскажите софт/идеи, ибо я совершенно не знаю спп, а сроки горят. Ну или нахуй пошлите тоже можно
Собственно код:
#include <iostream>
#include <vector>
#include <algorithm>
#include <set>
#include <cstdlib>
#include <cstdio>
#include <ctime>
using namespace std;
int main() {
int n, m;
scanf("%d%d", &n, &m);
int a[n], prev[n], next[n], maxlt[n], maxrt[n];
int maxNow = 0;
for (int i = 0; i < n; ++i) {
scanf("%d", &a);
if (!i) {
prev = (a == 0) - 1;
maxlt = a;
} else {
prev = prev[i - 1];
maxlt = max(maxlt[i - 1], a);
if (a == 0) {
prev = i;
}
}
if (a == 0) {
maxlt = 0;
}
}
for (int i = n - 1; i >= 0; --i) {
if (a == 0) {
next = i;
maxrt = 0;
} else {
if (i != n - 1) {
next = next[i + 1];
maxrt = max(maxrt[i + 1], a);
} else {
next = -1;
maxrt = a;
}
}
}
for (int i = 0; i < m; ++i) {
int l, r, h;
scanf("%d%d%d", &l, &r, &h);
if (next[l - 1] != -1 && next[l - 1] < r) {
printf("Yes\n");
continue;
}
if (prev[l - 1] != -1) {
if (maxlt[l - 1] < h) {
printf("Yes\n");
continue;
}
}
if (next[r - 1] != -1) {
if (maxrt[r - 1] < h) {
printf("Yes\n");
continue;
}
}
printf("No\n");
}
return 0;
}
Помогите студню-дебилу
Из навыков программиста обладаю только умением гуглить поэтому нашёл решение своей задачи на спп
Проблема такая - возможно ли перевести это решение на python или pascalABC.net? я НЕ прошу переводить просто подскажите софт/идеи, ибо я совершенно не знаю спп, а сроки горят. Ну или нахуй пошлите тоже можно
Собственно код:
#include <iostream>
#include <vector>
#include <algorithm>
#include <set>
#include <cstdlib>
#include <cstdio>
#include <ctime>
using namespace std;
int main() {
int n, m;
scanf("%d%d", &n, &m);
int a[n], prev[n], next[n], maxlt[n], maxrt[n];
int maxNow = 0;
for (int i = 0; i < n; ++i) {
scanf("%d", &a);
if (!i) {
prev = (a == 0) - 1;
maxlt = a;
} else {
prev = prev[i - 1];
maxlt = max(maxlt[i - 1], a);
if (a == 0) {
prev = i;
}
}
if (a == 0) {
maxlt = 0;
}
}
for (int i = n - 1; i >= 0; --i) {
if (a == 0) {
next = i;
maxrt = 0;
} else {
if (i != n - 1) {
next = next[i + 1];
maxrt = max(maxrt[i + 1], a);
} else {
next = -1;
maxrt = a;
}
}
}
for (int i = 0; i < m; ++i) {
int l, r, h;
scanf("%d%d%d", &l, &r, &h);
if (next[l - 1] != -1 && next[l - 1] < r) {
printf("Yes\n");
continue;
}
if (prev[l - 1] != -1) {
if (maxlt[l - 1] < h) {
printf("Yes\n");
continue;
}
}
if (next[r - 1] != -1) {
if (maxrt[r - 1] < h) {
printf("Yes\n");
continue;
}
}
printf("No\n");
}
return 0;
}
Пашол нахуй гандон и лишние либы с собой забирай
Замени scanf на input и printf на print и у тебя получится прога на питоне
А он точно умеет все то же?
Спс
class Player : public Entity
{
private:
string m_Name;
public:
Player(const string& name)
: m_Name(name) {}
string GetName() { return m_Name; }
};
понял, большое спасибо!
Я про книгу Страуструпа "Язык программировния C++". Желательно читать 4-е издание, про C++11. Только вот он на английском. Перевода нет.
Ну можно ещё 3-е специальное издание. Но тогда ты будешь изучать старую версию плюсов. В новой многое поменялось.
Я рекомендую эти толстые книги. Именно в них расписана вся-вся-вся суть языка. А другие его книжки - фуфло, язык по ним ты не выучишь. Там дополнительная или обзорная информация.
Не совсем, у тебя сначала вызывается дефолтный конструктор для поля, а потом копирующий конструктор. После двоеточия только один вызов конструктора с аргументом.
C++ - это Си с классами?
Только после двоеточия, ну или прямо в теле класса значением по умолчанию. Компилятор не знает, что ты будешь делать в теле конструктора, поэтому все члены класса так или иначе должны быть сконструированы до него, включая ссылки и объекты без дефолтных конструкторов.
Там уже в целом не такие большие потрясения.
>14 17
Ничего серьезного, по большей части синтаксический сахар и небольшие улучшения.
>20
Ещё пару лет на него только переходить будут, успеешь догнать
Звучит как пост для бугурт треда
ДИНАМИЧЕСКАЯ
@
ТИПИЗАЦИЯ
Кто вообще придумал неявные рантайм-проверки неявного же параметра назвать типизацией.
А потому, что каждый объект несёт свой тип. И это безумно мощно и удобно. Неявные проверки, кстати, в старину отключали в отлаженных программах.
мимо из лиспа
Объектов не существует, как и типов, есть только байты!
Нет б-га кроме Ричи и Страуструп пророк его. Покайтесь, ибо пиздец!
Каких еще байтов? Слов.
> И это безумно мощно и удобно.
Ну я в qt тоже могу в рантайме узнать какого класса объект каким методом меня вызывает, узнать все про его поля и методы, но требуется это обычно чуть чаще чем никогда.
Пацаны! Кто программировал WinAPI GDI, подскажите плиз.
Вот есть такая функция GetDeviceCaps(), она для Device Context возвращает его характеристики, вроде разрешения экрана.
Меня интересует её параметр PLANES - количество цветовых плоскостей. Функция выдаёт мне тут 1.
Кто-нибудь, может объяснить, что это такое? Я понимаю, что есть BITSPIXEL - количество бит на пиксель (у меня 32). Оно может быть 8, 16, 24, 32. Это настраивается в Свойствах Экрана. Но PLANES?
Что это за плоскости такие? Нигде в официальной документации описания этого я не нашёл. Я слышал, в видеопамяти, бывает отдельно лежат массивы красных, зеленых и синих пикселей экрана. Друг за другом. Вот это и есть плоскости. Это правда? Если так, нахуя так странно делать, и какой прок мне знать их количество?
А ещё, мне хотелось бы знать про GDI - есть ли в нём способ получить прямой доступ к памяти, и рисовать прямо устанавливая цвета пикселей без вызова SetPixel(), т.к. это тормозит.
Вот в DirectX можно сделать Surface, для неё вызвать Lock() и получишь искомое. А в GDI можно? Что-то я это не нахожу.
Заранее спасибо, с меня сотни нефти.
> А в GDI можно?
Неа, директ и создали чтобы это обходить, гди слишком тормозной для игор. Я где-то слышал это даже изначально не мс разработка.
Про остальное хз, наверное что-то связанное с рендером на любом говне.
Это пиздос, когда нужно написать больше 30 строчек на питоне, ты вместо этого сидишь и дрочишь преобразования одних типов в другие, потому что явно сука нигде не указано, что функция возвращает и какого типа у неё параметры.
очевидно что когда тебе нужно "преобразовывать" типы, то ты уже проебался
в лучшем случае делаешь костыль, а в худжем вообще используешь предложенный тебе программный код не по назначению
в этом и смысл статической типизации
Я про свой экспириенс с питоном написал. Со статической типизацией у нас в треде проблем нет.
Когда будешь писать что то сложнее laba.cpp, узнаешь зачем преобразовывают типы.
Ты ж сказал
> Сравнивать все созданные карты с только что созданной выглядит долго.
А с хешированием надо сравнивать не все, а только где хеши совпали
>есть ли в нём способ получить прямой доступ к памяти, и рисовать прямо устанавливая цвета пикселей без вызова SetPixel()
Да, посмотри GetBufferedPaintBits
Вкратце делаешь пару BeginPaint/EndPaint как обычно, внутри них делаешь пару BeginBufferedPaint/EndBufferedPaint, и внутри них уже вызываешь GetBufferedPaintBits чтобы получить буфер, куда писать пиксели
> Planes
Плоскость может содержать для каждого пикселя один или несколько битов. Так делали для экономии памяти и упрощения адресации: 3-битный цвет удобно раскидать по трем плоскостям, например. А если тебе при этом нужно только 2 цвета, ты работаешь с одной плоскостью, а остальные две просто сидят в устройстве и забиты нулями. Современные драйверы, скорее всего, будут всегда содержать одну плоскость.
Ну так в чем разница будет между хешем и картой? У меня при хранении карты лишних байтов нет.
В том, что когда ты ищешь по хешу, ты не сравниваешь хеш каждой старой карты с хешем новой. Ты считаешь хеш новой, и он тебе сразу дает адрес "хранилища" всех остальных карт с таким же хешем, и дальше ты уже ищешь только среди них, сокращая количество перебора на порядки.
Что является "хранилищем" зависит от того, где это всё хранится. Если на диске, то хеш может использоваться как имя папки, например. Ну или если это добро целиком в память загружено, то можно просто в unordered_map все эти карты затолкать, и скормить ему функцию хеширования, остальное он сам сделает.
Спасибо
Задача:
Вычислить число повторений в заданном разряде (не выше единиц тысяч)
случайного десятичного числа. Использовать оператор множественного выбора
switch и генератор случайных чисел rand(). Вывести результат.
Пояснение: нужно посчитать сколько раз будут повторяться цифры 0, 1 .. 9 в одной
из позиций числа для N случайных генераций числа.
Решение на пике
Нахуя тебе этот свич кейс если у тебя в любом случае независимо от результата ch%10 будет инкремент в sum[ch%10]? Можешь просто оставить sum[ch%10]++.
я бы с радостью, но в задаче просят, чтоб свич точно был
#include <iostream>
#include <vector>
#include <algorithm>
#include <ctime>
#include <cctype>
#include <string>
using namespace std;
int main()
{
vector <string> words;
words.push_back("ooo");
words.push_back("oooo");
words.push_back("ooooo");
words.push_back("oooooo");
words.push_back("ooooooo");
srand(static_cast <unsigned int>(time(0)));
random_shuffle(words.begin(), words.end());
string theWord = words[0];
vector <string> changedWord(theWord.size(), "-");
for (int i = 0; i <= theWord.size(); ++i)
{
cout << changedWord;
}
return 0;
}
#include <iostream>
#include <vector>
#include <algorithm>
#include <ctime>
#include <cctype>
#include <string>
using namespace std;
int main()
{
vector <string> words;
words.push_back("ooo");
words.push_back("oooo");
words.push_back("ooooo");
words.push_back("oooooo");
words.push_back("ooooooo");
srand(static_cast <unsigned int>(time(0)));
random_shuffle(words.begin(), words.end());
string theWord = words[0];
vector <string> changedWord(theWord.size(), "-");
for (int i = 0; i <= theWord.size(); ++i)
{
cout << changedWord;
}
return 0;
}
Очевидно ты хотел написать string changedWord, а не vector<string> changedWord.
Но цикл в любом случае бессмысленнен. Что ты считаешь? Количество букв в слове. И что дальше ты делаешь?
Пидор демпингует, а ты в 2020 не можешь:
1)Скомпилировать сам и посмотреть какую ошибку компилятор выдает
2)Поискать её в гугле
3)Если на предыдущие пункты айкью не хватило, то хотя бы дать анончикам код в удобоваримом варианте, которые на доске описаны.
Поэтому этому соси хуй.
Да что такое 700 руб нынче? Это пшик!
Я их трачу за один поход в магаз за ёбаными продуктами. Или 1 раз пообедать в забегаловке.
Есть где-то Argon2id/chukwa майнер, с поддержкой СUDA 8.0,
для GPU-майнинга Nvidia-видеокартами,
TurtleCoin-based монет с кастомными префиксами,
и прямо на daemon?
Насколько сложно заебенить такую хуйню?
Можно ли её заебенить, дополнив этот майнер https://github.com/turtlecoin/turtlecoin/tree/development/src/miner
какими-то cuda-файлами и задав кастомный префикс, в виде магического аргумента командной строки?
Не шарю в двух плюсах ваще.
Что непонятного то? Вот у тебя массив предметов допустим items. Пишешь просто что-то вроде этого https://pastebin.com/g0PcxYnH и все.
>ютуб канал
Почитай условного Прату с C++ Primer или любую другую книгу из шапки. А так для твоей конкретной проблемы можешь поискать конкретные примеры на гитхабе. Вот первое, что попалось по запросу " "FilterByPredicate" TArray ":
https://github.com/MasteraVodoProvodchiki/frox-ue4/blob/5daa4e50467dcab4cd0f1104106be020e5da5fcc/Plugins/FroxPlugin/Source/FroxPlugin/Private/FroxComputeFlowAsset.cpp#L203
https://github.com/SheepShanker/UE4-4.23.1-release-toon/blob/37596dc49be3f95af5355422d942ad26ea7c4789/Engine/Source/Runtime/Online/BuildPatchServices/Private/Tests/Fake/ChunkReferenceTracker.fake.h#L39
какой же он долбоеб
Такой чепушила от одной плюхи отлетит. Его вид дискредитирует крестобояр
Столкнуться с подобным на рабочем месте — мой основной страх перед трудовой эмиграцией. Как блядь насмотришься на этих хуесосов, настроение сразу падает.
Си
Так он недорогой...
Блять. Я перепутал порядок.
стой. я не понял. На пике то как я понимаю числа представлены. Где ошибка?
Это UB
Прикольно. Я как узнать какой порядок у меня, компилятора на левом сайте, и от чего от зависит?
Младший байт инта у x86[_64] это и есть первый его байт в памяти, Little Endian называется, гугли.
#include <bit>
if constexpr (std::endian::native == std::endian::big)
{
}
else if constexpr (std::endian::native == std::endian::little)
{
}
Это зависит от железа, по большей части. При разработке на пк с big endian столкнешься пожалуй только в обработке изображений, да передаче данных по сети.
Фух. Мне возможно мой код надо будет с винды на линукс переносить. Думал мозгоебля обеспечена
Лучше всего прогать так, чтобы зависимости от порядка байтов не было. Не нужно из указателя на int извлекать char. Прочитай весь int, выдели char операцией типа & 0xFF.
Мне нужно данные с клиента на сервер принять, вот и ебусь. С клиента они пришли с порядке о большего к меньшему
Ну мне нужно отправить поле игровое. Я его так и отправлял. Привык, что порядок такой ну и отправил. А на сервере какая то ерунда началась. Когда вывожу в сыром виде, все ок, работает. Пытаться обработать, запихнуть в примитив через указатели и начинается что то странное.
Не только студию, но и поддержку студии в vs/vscode......
Чтобы что-то куда-то отправить (и где-то принять), нужно это сперва сериализовать в соответствии со строгим протоколом, иначе уязвимая система получится.
Он ее не делает, он пиздит и на конфочках выступает. Девелопер адвокат он, или чето такое
Ну как я это представил: первый байт тип команды, потом в зависимости от команды структура разная. Для команды сохранить поле структура такая: в начале 2 четырехбайтовых поля размера поля, а потом само поле в бинарном виде. Поле это по сути размеченый в клеточки прямоугольник, так что по размерам можно спокойно работать с полем. Двоичные данные приходят нормально, я проверил. Дальше что произошло я уже объяснил.
Ты как на работу устроился бля?
а почему не перешел? Мы вон вообще все наши проекты мигрировали на С++17 + /permissive.
Как только выйдет новая студия - поедем на C++20, т.к. весь преворк уже сделан.
Тогда только дефайнами, а их уже подставляй из мейкфайла или что там у тебя.
ну так в чем проблема взять и мигрировать? Чинишь ошибки компиляции пока не взлетит и всё.
Ой далбаеб...
Нет я очень далеко не джун, я просто вьебал 3 дня и перевел все наши, и так достаточно хорошо написанные проекты. на С++17.
Единственное, конечно, что у нас все депенденси либо хедер-онли, либо не заброшенное говно.
Надо было на Яву переписать
я уже нашел вроде, надо заPOLLить его, вроде должно скрыть очевидные недостатки
Вот она, непредсказуемость ++с
Ну расскажи мне про сложности тестирования своей лаба2.cpp
>even in the presence on threads
Ага, и там в хотлупе потом боттлнек из-за thread-safe-static-initialization. Проходили.
Но в целом миленько, да.
Внимание, нюфага вопрос.
Почему когда я гуглю какой-то вопрос, то там обязательно присутствует кусок говно кода?
По типу гуглишь какую-то функцию из стандарт библиотеки, а какой-то 12лет пробраммист переписал эту функцию на свой лад с лярдом костылей и говностилистикой.
/mg/
Так в случае с call_once надо будет написать все то же самое, только оно будет еще и в call_once обернуто и заведена дополнительно переменная под флаг. Может я что то не так понял?
Потому что передается указатель, известный до создания переменной.
Не смог заставить g++ сказать что-то похожее
"Значение типа const char * нельзя присвоить сущности типа LPWSTR"
Говорят нужно включить в настройках проекта многобайтовую кодировку, но не могу найти где.
Значение типа "const wchar_t *" нельзя присвоить сущности типа LPSTR
Осталось это победить.
Тупит на эти две нижнии строчки.
STARTUPINFO startInfo1 = {}, startInfo2 = {};
startInfo1.lpTitle = "Child Process 1";
startInfo2.lpTitle = "Child Process 2";
Чем убрать ошибку?
const wchar_t нельзя присвоить сущности типа LPSTR
На многобайтовую кодировку переключил.
STARTUPINFOW
Можно. Компилируешь ndk и получаешь .so
Минимальная обвязка на java там все равно будет чтобы запустить + многие функции API тебе придется дергать через jni интерфейс.
Ну да. Там че то нужно скачивать. Я в том смысле что тебе будет похуй под какуб платформу писать. Он скомпилирует и под андроид и под комп
При создании массива:
int *Arr;
Arr = new int[ 4 ];
Шо происходит?
Как я это понимаю - создаётся массив из указателей, которые хранят адреса на данные типа инт.
Иле же второй вариант - выделяется группа адресов под тип инт?
Нахрена я это спрашиваю.
Идея следующая - избежать лишних копирований. Вот есть массив размером 30 и два по 5. Задача скопировать туда данные с неким смещением от начала массива и есть два варианта первый и простой - просто копируем со смещением, второй - заполнить итоговый массив лишь адресами на элементы каждого из массивов. У меня путаница и недопонимание - мне для воплощения второго плана нужен просто массив созданный как выше или всё таки нужен массив указателей на указатели.
Все неправильно. Выделяется одна область памяти под 4 инта и на первый элемент указывает твоя переменная Arr.
Чо?
Нихуя не понял, адрес если что больше весит чем инт в х64, так что не сработает твой план оптимизации. Оставь как есть копирование и не еби себе мозг.
UB раз или segfault в глаз?
Как правильно заходить в функцию? Стек фрейм под ноги бросят - не поднимай.
void* из стека или optional c кучи?
Две ветки в деструкторе - в одной abort, в другой throw. Куда приземлишься?
Мать жива?
Шуе цпп! Благодарю, анончик.
Вакансии есть, но требования пиздец. С ЧУТЬ ЧУТЬ СИПЛЮСПЛЮС и ЧУТЬ ЧУТЬ ВИНАПИ - это дохлая тема.
А какой стек вообще вкатышу надо знать? У меня создаётся впечатление что с++ язык для того чтобы лазить под капот систем, соответственно нужны хорошие знание в целом в компьютер сайнс.
Понятно. Эхх, бедолага... А мог бы PHP учить. Или даже пакеты ловить ртом и выпердывать жопой как я. Всё больше денег было бы
ну я, не смотря на свою адовую зарплату крестовиком таки считаю, что сейчас правда 0 смысла вкатываться в кресты, только по очень большой любви.
Сишарп\го\тупоскрипт - сьедобно и оплачивается, как минимум, не хуже
Ну я так понимаю ты как раз человек который разбирается в очень большом спектре IT знаний и наверное обслуживает легаси при этом?
> Две ветки в деструкторе - в одной abort, в другой throw. Куда приземлишься?
throw конечно, там хоть выбраться можно
я вкатился по очень большой любви, и потом мне 3 раза подряд охуительно повезло с работой. С++ я знаю на очень серьезном уровне, и вообще да, разбираюсь дохера в чем.
Но, судя по всему, я бы мог еще х2 получать, удаленя на какой-нить параше типа тайпскрипта.
Заходишь в компилятор, тебе ассемблер под ноги кидает strcmp, в какой регистр каунтер положишь?
Любая библиотека для юниттестов. Например Catch2 или Doctest, и отдельный таргет в симейке, который будет запускать их.
и ты бы еще все таки -O2 добавлял
bullshit
бывают бывают. В Нвидии пара команд, типа той же КУДЫ - полностью на удаленке еще до пандемии была. Другое дело, что там официальное трудоустройство и с налогами есть нюансы, если ты будешь больше полугода жить не в стране устройства...
Труе язык общего назначения, конечно тут не будет как в пхп json_encode()
Можно подумать в сисярпе не так, лол. Так же будешь учить фреймворки для гуя (что там с WPF под линупс?), так же будет какой нибудь BouncyCastle или BCrypt (постоянно вижу кучу thirdparty dll в папках с прогами, тот же Newton для json). Ничем тащемта не отличается от поиска всяких пакетов в нугете или что там у вас, только они распространяются в естественной форме - в виде исходников.
А в чем проблема? Добавляешь в проект все .cpp и в дополнительных каталогах включаемых файлов указываешь путь к папке с хедерами.
Я понимаю, что помогаю тому кому не надо бы помогать, но if тут видимо нужен чтобы проверить четность степени и поставить минус, а цикле ты просто пробегаешься по степеням x как указано в формуле и получаешь итоговую сумму
Только ветвления и циклы никак не получится, будет еще как минимум вызов фунции (main) и арифметические операции.
Харкни в лицо за такие ограничения. Лучше учись стандартными функциями пользоваться. Они бы ещё тебе на ассемблере сказали это писать
Можно заабузить умножение на -1. Завести переменную равную -1 в каждой итерации делать *= для нее на -1. В итоге выходит как надо в первой итерации -1 х -1 = 1, во второй 1 х -1 = -1 и т.д.
Бля пацаны,я дибил,там есть пример.Но так как я дибил я все равно ничего не понял
Какой всратый код.
Я конечно тупой, но не до такой степени, это всё я проделал как в туториале, как визуал студио не видела никакого ffmpeg и всё
Есть 2 структуры (пикрил 1), как видно они почти похожи, но некоторые поля имеют другой размер, почти все значения этих полей будут повторяться, что для одной структуры что для другой. Структуры будут записаны в файл.
Так вот, как заполнить структуру так, чтобы не плодить одинаковый код как на (пикриле 2)? Может это нормально, но как по мне всрато выглядит.
Думаю можно разбить структуру и составлять её по кускам и также по кускам записывать в файл как на (пикриле 3).
> Так вот, как заполнить структуру так, чтобы не плодить одинаковый код как на (пикриле 2)?
Сделать какой-нибудь make класс\функцию которая будет возвращать нужное значение.
Типа
if( q == 1 ) { return { 0x1, 0x2 }; )
if( q == 2 ) { return { 0x1001, 0x20001 }; )
Вся труевая сишная системщина - блевота.
Могу только предложишь обернуть это все в нормальный С++.
Можно написать макрос #define, заполняющий общие поля одинаковыми значениями. И просто вызвать его и там, и там.
Ещё, если это C++, можно определить эту структуру как шаблон, и передавать тот тип ULONGLONG в 64-битной версии как параметр шаблона. Сделать ему typedef внутри структуры и применять.
Аналогично, сделать шаблонную функцию для инициализации полей структуры.
И вот это отличное идиоматичное решение, если наплевать, что получишь на выходе раздутый код.
Ещё, если структуры отличаются не просто типом отдельных полей, а уже и их составом (где-то больше, где-то меньше) - тут уже с шаблоном туго. Правда можно юзать наследование. Но тогда опять, различия должны приходится лишь на последние поля. Вперемешку не выйдет.
Всех благодарю за ответы.
Даже не ожидал такой адекватности.
Программу писал на сях, вот этот только момент с структурами мне покоя не дает. Хочу переписать на плюсыси с классами, кода не много и использовать обертки над винапи, никогда такого ещё не делал. Буду дальше ковырять. Как подметил этот господин >>811365 вперемешку может и не получиться так как они ещё и одним полем отличаются. В любом случае попробую с шаблонами поиграться.
Тут проще всего генерацией кода по текстовому шаблону.
Беги с этого института
>Есть карта для того, чтобы вкатиться в джуны по плюсам
Карты нет, так как плюсы во многом опираются на предметную область, в которой ты собираешься работать.
нет
Так, но во всех остальных местах предметная область называется ВЕБ, поэтому затруднений с планом меньше.
Старая уже, предпочитаю помоложе, а что?
Вкатываюсь(пытаюсь, во всяком случае) в С++ из Си (да да, я байтоеб микриков ебучих) и пытаюсь понять, чем подход ООП в С++ отличается от процедурного программирования в Си.
Я правильно понял:
Задача: написать прогу чтобы волк ел мяско и коровка кушала травку постоянно.
В Си инструкции выполняются одни за другой и там нужно писать так:
while (1)
{
wolf_eat(meat);
cow_eat(grass);
};
Когда в С++ объекты занимаются своими делами сами по себе, и если им поставить задачу, они будут ею заниматься без постороннего участия:
wolf.eat(meat);
cow.eat(grass);
while (1);
В си ты заполняешь структуру указателей на функции своими колбеками и передаёшь получившийся объект дальше в функцию.
В плюсах ты реализуешь методы абстрактного класса. Вот и вся разница.
Нет, там тоже будет цикл
while(1)
{
wolf.speak();
cow.speak();
}
разница начнется в том что на плюсах можно делать так
class Animal { virtual speak(); }
class Wolf : Animal { speak() { cout << "uwu"; } }
class Cow : Animal { speak() { cout << "moo"; } }
while(1)
{
for(animal& : list_animals)
animal.speak();
}
Алсо цикл в каком нибудь фреймворке, конечно, можно спрятать.
Сделать какую нибудь регистрацию.
Впрочем это в любом языке.
Я вредный вор просто.
Иди выебывайся умными словами в другое место, гандон.
Почему, объясните мне, почему вы называете это колбеками?
Да, ты эмулируешь "методы" таким образом, но это не само себе не обязательно должно использоваться коллбеков.
Это перпендикулярные вещи.
Я проебался со склонениями, пока редактировал сообщение, но суть передана, надеюсь.
На всякий случай поправлю:
>Да, ты эмулируешь "методы" таким образом, но получившаяся конструкция может быть и никак не связана с понятием колбека.
Аноны, в чём отличие стандартов? Ну я более менее уже освоил С++(основы по книге одной книге Страуструпа), но так и не понял в чём отличие стандартов?
С++11 С++14 и т.д.
И сильные ли различия между этими стандартами?
>Вкатываюсь(пытаюсь, во всяком случае) в С++ из Си
как будто сюда как то по другому попадают. все с++ выходцы из си.
обычно тру байтолюб после плюсов на асмы вкатывается. у меня лично такие планы после осовения с++ до приемлемого уровня перекатываться в асмы
Довольно сильные, добавляют мощные фичи и чуть меняют смысл написанного ранее кода.
То есть перегружают некоторые синтасические конструкции\символы\обозначения и добавляют поддержку каких-либо функций\библиотек?
Я начал с плюсов, потом ушёл в си, асм и криптографию, потом ушёл в другую криптографию, в которую протягиваю плюсы.
Ну ты олигарх прямо
обычно такое делают иерархией наследования pod классов
Рикаминдую Бартека Филипека: C++17 in detail. Там в основном про отличия именно 17 стандарта, но иногда и исторический экскурс, типа, "в 11 было так, в 14 так, а в 17 еще и так".
Приобрести можно на рутрекере
many thanks to you
Так там и написано так, чтоб было просто.
В чем вопрос? Без выделения памяти или что?
Каком массиве?
Вызвал operator[] для класса string, обратившись таким образом к элементу строки.
Медленно пишится код.
Зачем это говно нужно? Всё ещё жалею что купил книгу по cpp, а не по нормальному языку, жалко денег теперь приходится читать
а теперь попробуй сам написать калькулятор
Потому что говно. Писать сложно так же как и на С, зато куча костылей и каша из сахара. В том же Zig намного приятнее сделано, но это пока что полигон для компилятородрочеров.
Я вообще начинал с C#, перекатывался на кресты и в итоге укатился на сишку в ожидании релиза Zig или хотя бы V.
На плюсах писать так же легко, как и на C# С++ выглядит гораздо локаничней по сравнению с шарпом.
>купил книгу
Пикрелейтед. Книги покупать нужно пост-фактум, если тебе понравились или поставить на полку на высокое место, чтобы все видели.
Ну так на первых порах мне понравилось, это когда начал углубляться осознал
Вкатываюсь в плюсы, есть два вопроса:
1. Что изучать после стандартной библиотеки? Вроде как основы уже знаю, хочется делать что-то большее, чем задачки с хакерранка решать, но знаний для стажировки даже, вероятно, мало еще, а сам я еще не настолько преисполнился, чтобы в свободное время пет-проекты пилить, да и идей ноль.
2. Каков шанс, что слова вроде "плюсы не нужны, нового на нем не пишут, хочешь денег - учи джаву" являются правдой? Спрашиваю у опытных крестописцев, хочется писать интересные и сложные вещи на божественном с++, двигать технологии вперед (да, розовые очки присутствуют), но с голой жопой под смешки джавистов, продавшихся банкам за 100к+, тоже сидеть нет желания.
Короче, как думаете, следовать зову сердца или забить уже и метить на позицию говнокодера в банке?
Гы, вот это они лохи конечно.
Я студент, с вышкой проблем не будет
>как будто сюда как то по другому попадают. все с++ выходцы из си.
Нормальные люди поступают в вуз на программную инженерию и там учат computer science(ооп, алгоритмы и данные, архитектуру компьютера) и там же на лабах учат с++. Из них становятся хорошие программисты после окончания вуза.
А если ты пару лет байтоебил микрики с не-прогерским образованием(радиотехника, асутп, электроника и т.д.), а потом ты решил вкатиться в с++, чтобы больше зарабатывать, то нормальным прогером ты никогда не станешь, разве что каким нибудь быдлокодером-макакой.
>интересные и сложные вещи
Ты индустрией ошибся. Попробуй медицину там, или какую-нибудь инженерию.
Не ошибся. Понимаю, что чаще всего программирование это рутина, а не парк развлечений, но всякая рутина это часть чего-то большого. Понимаю, что во мне говорит энтузиазм начинающего, когда-то он пройдет, но сейчас мне просто нужно мнение более компетентных людей о современном положении дел, так сказать. Ну и совет, куда глядеть после STL, конечно.
Программирование - это пиздец какая рутина. И тебя никто никогда не допустит ни до чего интересного первые лет 5 точно. И далеко не факт, что пустят дальше.
Вся работа за хорошие деньги - это мусорное дрочево, где ты лишь винтик.
А глядеть никуда не надо - пиши полноценный код. Хуй знает, 2д игру, уебанскую базу данных, какой-нить говнопарсер парсер, хоть что-нибудь, только пиши.
Берут, меня звали
Спасибо за ответ!
>радиoтехника и электрoника
С пару сотен вакансий по 30-40к.
>высoкoурoвневoе прoграммирoвание
Десятки тысяч вакансий с зп 100-150к в среднем.
До первого UB.
я обсуждаю это как хобби. гораздо интереснее с микроконроллерами тусоваться, с драйверами и методами ос, нежели со всякими сайтиками, играми и прочим фуфлом.
ну а так с твоей логикой что главное вакансии и деньги можешь вообще в js тред выкатиться
ну у нас есть всякие системные архитекторы и исследователи, которым интересно все таки.
А те не похуй?
Или ты типа за шиши сраные, пендосские, собрался пилить мне чо-то, своим кривым былдокодом, да капиталистоблядок?
Так я, лучче, сам запилю себе "Годный майнер" ©®™, а ты иди дальше клянчи бюджеты, в каких-нибудь мочерских гитхабах туртлакойна.
Работа с сетью, работа с графикой.
Бери либу imgui и ебашь какие-нибудь интересные проги, расчёты-хуёты, построение графиков и кривых десятого порядка.
cppquiz.org
Напиши сетюидную прогу, которая печатает файл тогда и только тогда, когда у пользователя есть к нему доступ.
>Win32+boost+курлы+жонглирование жсонами. рикаминдую
Слишком сложно.
>>813195
>Какую-нибудь визуализацию для аудио. И UI, и байтоёбство, и матан. Hard: самим написать декодер. Dante Must Die: в реальном времени, с проигрыванием самой музыки.
Если это мне, то тоже очень сложно, хотя я думал об этом.
>>813246
>Работа с сетью, работа с графикой.
>Бери либу imgui и ебашь какие-нибудь интересные проги, расчёты-хуёты, построение графиков и кривых десятого порядка.
С сетью думал об этом, что интересно, но я в этой области слабовато ориентируюсь. Графики слишком легко же, нет? Вбил x, получил y.
>>813480
>Напиши сетюидную прогу, которая печатает файл тогда и только тогда, когда у пользователя есть к нему доступ.
Что значит сетюидная прога и в чем смысл такой программы? Типа, кто-то обходит это ограничение и получает неправомерно информацию?
Кстати, интересно, какие перспективы у байтоебства? Мощности пк нарастают, и манагеры в основном требуют скорость разроботки в угоду производительности, по крайней мере, я про это читал. Получается, лучше прогать быстро, чем за каждый бит оперативы сражаться?
>Получается, лучше прогать быстро, чем за каждый бит оперативы сражаться?
От сферы зависит.
Моя софтина считает сто тысяч подписей в секунду на сферическом процессоре, а у конкурентов — 80 штучек в секунду. И перекрыть скейлинг количеством серверов при таком разрыве просто нереально. Это влияет на то, в какие секторы рынка можно протолкнуть ваш продукт, а в какие нет.
Но в очень многих случаях важно, чтоб работало, а ресурсов хватит, лишь бы не слишком хуево работало, а там дальше разберемся, если будет необходимо. Конечно в таких случаях лучше сделать до завтра, чем никогда.
Не-а.
Без дополнительных скачиваний не обойтись, видимо.. Вряд ли позволят, ну ладно.
> Вряд ли позволят, ну ладно.
Ебанат? Что тебе там должны позволить? Нахуй такое заведение идёт
Емнип objcopy предназначен для стрипа символов.
То что нужно, спасибо!
strip
Ну и раз тут у вас так людно провокну мини-бугурт: винда со студией или линукс с терминалом?
Оба два.
Я обычно всю разработку веду под линуксом в терминале.
Там же отладка, тесты, етц.
Потом пулю ветку под виндой, собираю всё, доделываю виндо-специфичный функционал, вношу виндо-специфичные правки, етц.
Не понял с чего бугуртить. С того, что кто-то делает иначе? Ну и ладно.
Винда + студия - если нужно, то кросскомпилирую через студийные ремоут средства на ВМке линуксовой.
Дедов с терминалом не слушай, они безнадежны
Винда с вскодом, в котором есть терминал.
Тебе не надо.
ПО разрабатывается обычно для какой-то операционки. Если говорить про РАБОТУ - то полноценная кроссплатформа там достаточно редкая вещь (ниразу не видел ни я, ни мои знакомые\коллеги). Соотв-но если ты пишешь какое-то серверное говно - то оно будет под линукс. Значит и разработка будет удобнее под линукс Хотя из этого есть исключения. Весь яндекс сидит на вижуал студии, хотя у них почти весь софт под никсы внутренний
Оверолл, как ойти специалисту - линукс знать нужно на каком-то уровне, он встречается повсюду. Но ставить его домой - нахуй не надо, как и без необходимости писать под него, когда есть Винда + Студия.
Почти 3 года писал под линукс, когда увольнялся последний раз - работу с линуксом просто не рассматривал даже, ибо идут они нахуй. Сейчас уже 4 года на винде пишу на работе - полет отличный
Понял, спасибо
Формат файла:
ff e0 ab 22 14 88 и т.д.
Чтение:
file >> std::hex >> byte;
Понял.
Бля, я даун. Как создать БИНАРНЫЙ файл через консоль? Я создал текстовый через нано и думал, что если открыть через байнари, то все получится
Можешь читать текстовый как бинарный, какая разница?
Просто игнорируешь смысловую нагрузку ASCII
А вообще: man xxd
Лол, я ошибся. Я создал текстовый файл, в котором написал байты, а работал с ним, как с бинарным. У меня же байтовое представление отличается от строчного.
Да это понятно
Sdl и opengl
Если бы нашёлся кто-то кто возьмёт меня на работу после 1 прочитанной книги то я бы здесь уже не сидел.
РНН или кроме чтения ничем полезным не занимался?
можно выставить любой dpi, сделать его равным ppi монитора
есть растровые шрифты
по итогу можно сделать буквы что будут гореть пиксель в пиксель
есть тайловые менеджеры окон и мультиплексоры терминалов
по итогу идеальный ui можно организовать для кодинга
в винде, к сожалению, этого нет
фак говно, тебя наебали
у страуструпа хорошие книги - 4 special ed, и "дизайн и эволюция языка"
Причём не из-за того, что это невозможно, а просто она в этом направлении не развивается, там у людей немного другой workflow.
А я без вот этого
> есть тайловые менеджеры окон и мультиплексоры терминалов
в нормальном виде жить уже не могу
>фак говно
В этом то я уже убедился. Но раз уж я уже прочитал 2 издание то что делать дальше? Есть роадмап какой-нибудь или мне за нормальным факом на какой-нибудь реддит идти?
Короче, анон, как бы я не улучшал математику (делаю матрицы поворота или n точек выстраиваю в матрицу, какие-то ухищрения в духе "если длина < порога, то вернуть ноль), и нет качественного прироста скорости.
Запускаю профилировщик, узкие места да, в моих функциях, больше всего тратитится ресурсов на sin, cos или atan2. Но анон поразительно то, что я кардинально менял подход вычислений, а на финальной скорости сказывается незначительно. В лучшем случае прирост был на 70%, хотя я ожидал раз в 100.
Как так? Как поступать?
рекомендую
4 special ed страуса, шаблоны вандервуда, последнюю книгу майерса про 14е кресты
это в качестве минимума, чтобыхотя бы понимать современный код чуть-чуть
Я и делаю. Тест около 100мс занимает, это много. Количество точек 1000 х 1000, попыток 20. Рандом при запуске
За контент спасибо, это деду надо. А с какого момента примерно можно начинать пилить пет проекты и где подсмотреть идеи для оных? (понятно что я и сейчас с гуглом и стаком наперевес могу начинать но я бы базы ещё поднабрался). Ну и вообще в какие направления лучше всего уходить сейчас?
Про кншгрид не слышал, спасибо. Ассемблер не хочу смотреть, боюсь, не увижу каких-то там откровений, будут sincos.
А simd.. Eigen вроде учитывает всю эту хуйню, там тема выравнивания данных в топе. Короче, я думаю Eigen лучше меня соптимизирует векторизумые участки.
Анон, а что там с gpu? Есть ли смысл взять вулкан апи, там же вроде есть линал? Просто cuda проприетарна
Норм тема вроде. Стоит смотреть?
Аноны, как сконвертировать
>uint64_t baseReward
отсюда:
https://github.com/satorigold/SatoriGold/blob/f36f7d003a7051818ba72f8d1142ae573f550a31/src/CryptoNoteCore/Currency.cpp#L155
в строчку, и вывести её здесь: https://rextester.com/l/cpp_online_compiler_gcc
Хочу рассчитать в цикле, все награды за все блоки в сети SatoriGold (SAU), которая без премайна, и которую мы майним вот здесь: https://miningpoolstats.stream/satoricoin
Он его не контролирует. А мутант потому, что в комитете каждый добавляет фичу нужную ему (Nvidia, M$, Google и тд)
Алгоритмодаун, плиз
> в комитете каждый добавляет фичу нужную ему
Только для принятия любой фичи не должно быть ни одного члена комитета, проголосовавшего против.
А им похуй если не касается их области.
>где подсмотреть идеи для оных
Даю идею, не благодари. Напиши игру - скроллер. Где самолёт внизу экрана летит вперёд, а сверху на него надвигаются всякие враги (и ландшафт на фоне). И надо сбивать врагов, или уворачиваться стрейфясь влево-вправо. Вот это была моя первая программа на плюсах.
>M$
Вот, понимаешь, прилепился значок. MS уже не та что раньше.
Теперь у Apple самые загребущие руки. Вот к нему надо значок приделывать.
Вопрос, как захуячить гифку из набора кадров QPixmap, как прихуячить программу к кнопку принтскрина на линухе
Сколько шаблонов написал?
За неделю ты если только азы Си изучил - а он действительно няшный.
Грамматика это грамматика. Компилятор так видит. Это то же самое, как если бы писал разбор по русскому - два - числительное, простое, количественное, целое, именительный падеж.
gif формат хоть и имеет гораздо больший размер, всё же более удобен. В пересылке в телеге или другом мессенджере gif файлы в большинстве случаях запускаются автоматически и без каких либо проблем.
Впринципе уже знаю как сделать mp4, думаю и с webm проблем не будет. Но вот сука gif не поддаётся, хотя казалось бы самое простое.
Я хуй знает, буду благодарен даже если скинут адекватную статью по кодекам'/декодекам гифок. Хоть что-то за что можно зацепиться.
бтв уже нашёл ImageMagick++. Сам для создания mp4 хуеты юзаю няшный OpenCV(хоть он и для другого предназначен лол).
ImageMagick я в рот трахал, там такая страшная документация, не удивительно что он не поддерживается.
Кароче реквестирую способы создания gif файла, имея массив картинок, которые сами по себе массивы x, y, RGB or HSV
Там была какая то залупа с патентом, поэтому поддержку гифа все неохотно внедряли. Так то либ дофига
https://project-awesome.org/davisonio/awesome-gif#libraries
да, вроде какая-то компания в далеком далёком году взяла да и сказала мол, права на гиф у меня, платите. А тогда гифками все уже активно пользовались и как ты понимаешь большая часть платить не собиралась. Что-то подобное и сейчас есть, какие то проблемы с правами/патентом, в общем комерческая жопа, ненавижу. Блять, права на самую простую кодировку в мире блять, ахуенно. Алсо гифка ко всем минусам ещё и уёбищно сжимает размер, раз в 6 хуже avc. Но увы, веб на ней хорошо сидит, как на героине) Хотя уже давно юзают на сайтах и урезанные mp4, у которых включили автоповторение и вырубили звук. Свои костыли
Да, видел это. Хотел почитать про то как это делается конкретно в коде, без юзания функций из коробки.
Спасибо.
Как делать файл руками? Ну описаний формата полно, там довольно типично все - заголовок, размер картинки, палитра, потом кадры (со своими палитрами и размерами, если кусочек анимируется, и временем задержки) и все эти потоки упакованы lzw.
https://habr.com/ru/post/274917/
опа, годная статья. Хз как пропустил, уже почти на второй странице гугла был. Спасибо, анонче.
Не. Мутант ещё из-за необходимости обратной совместимости. Сначала с C, а теперь и с предыдущими стандартами C++
А я, как дебил, в два часа ночи, вместо того, что бы давно вкорячить какой нибудь Спарк, пилю сраное говно на плюсах, потому что "мы не тащим в наш стек лишние технологии".
Джавист порвался)
Сложно всё ручками делать, самому, да? А теперь представь титанов, что твои Лиды на джава написали, иди джаву машину
То, что не будет проблем, я в курсе, сказочные ifndef endif pragma once, но я спрашиваю именно про размер выходных файлов, он будет больше нежели бы мы один раз подключили Map?
Спасибо
> примеры (хорошего) кода
> - Исходники игр, игровых движков. Doom 2, Doom 3, Unreal
Давай теперь послушаем настоящего профессионала (мехмат МГУ, 20 лет в Калифорнии пишет для Playstation)
https://kunaifusu.livejournal.com/467799.html
... Пока Кармаковские кракозябры (это кодом назвать сложно, разве что в смысле "код Да Винчи") продаются и вызывают ахи и вздохи хипстеров я на хлебушек смогу заработать.
... Кармак же, со своим программированием на уровне шестиклассника ...
... Там куча проблем с перформансом и с логикой
Некоторые процессоры типа АРМ вообще не умеют читать невыровненное.
На остальных невыровненные могут читаться медленнее.
Скажем в кэш-линии помещается 16 интов
Ты читаешь по адресу на границе
Может понадобиться чтение двух линий по 16 интов из памяти
----xx][xxxxxx----
Плюс может быть промах мимо страницы что вообще займет в 100 раз дольше времени.
Процессоры любят, чтобы те данные что они читают/пишут в память, лежали по адресам, кратным 2-м, 4-м, 8-и, и т.п. Это и есть требование выравнивания.
Некоторые марки процессоров попросту отказываются работать с невыровненными данными (возникает ошибка). Это сделано для их удешевления и/или ускорения.
Другие марки, как тот же x86, всего лишь испытывают доп. тормоза на невыровненных данных. Впрочем SSE инструкции требуют выравнивания на 16-байтной границе, иначе генерируют ошибки.
Тут слово "хороший" не зря в скобках стоит. Оно опционально.
Даже если в коде Кармака есть проблемы, это не значит что он никчёмный, и оттуда ньюфагу (и не только ему) ничего полезного подчерпнуть не выйдет.
Пусть изучает, как код люди пишут. Разный код.
А что касается этого персонажа... Код Кармака мы видели, а код персонажа что-то ещё нет. А обосрать на словах, много труда не требуется.
> Покажи более вкусную пищу в сельском толчке, чем понос бабы-сраки
Ты в каком году живёшь, дедуля? auto и лямбды хоть используешь?
Авто постоянно, лямбды зло размазывающее логику по коду и провоцирующее копипаст.
Ну да, мы лучше будем слушать анонимный скот с двача, чем того, кто над $120,000.00 to $130,000.00 /year смеется...
https://kunaifusu.livejournal.com/648138.html
Вот тебе примеры кода.. Конечно, реальный боевой тебе никто не выложит, но компетентность оценить можно
https://kunaifusu.livejournal.com/299377.html
https://kunaifusu.livejournal.com/283667.html
>объявить статическую переменную, скопировать ее по ДМА (естесвенно посрав на все конструкторы копирования и прочия операторы присваивания), вызвать несколько функций
Да, компетенция уровня UB
Нет, это твоя некомпетенция... ты не понимаешь, о какой среде выполнения кода вообще ведется речь
Отлично понимаю, мань - UB это свойство стандарта языка, а не среды выполнения. А по чему копируешь - это дело десятое, хоть по SPI.
Еще хрюкни.
я тоже смеюсь над $120k\y в штатах, это на руки меньше, чем у меня в Москве.
Другое дело, что этот микрочелик - реально шизоид какой-то.
Да
А мне они больше кажутся шизофренией - когда человек писал книгу и вдруг вместо новой главы начал вести записи о покупках в магазине прямо поверх текста.
x = ++x + ++x;
x = (x = x + 1) + (x = x + 1)
x = (6 = 6 + 1) + (x = 6)
x = (6 = 7) + (x = 6)
x = 7 + 7
x = 14
это правильно?
С++17
А не, неправильно прочитал
Таки UB
в C++17 вроде не UB уже
Да, си-тред два блока ниже
Пoнял, буду прoдoлжать. Пoсле Страуса, хoтел бы в архитектуру эвм вкатиться и ассемблеры(си уже знаю). Нo тут рoдаки капают на мoзг усиленнo пoэтoму пoка упoр сделал на задачи с литкoда и алгoритмы, вкачусь и буду в свoбoднoе время oбмазываться архитектурoй и асмами
Когда там его примут?
typedef struct Node //"связанное представление"
{
int value; //Значение
Node left; //потомки
Node right;
} Node;
Node root = NULL; //Дерево (корневой элемент)
//Добавить в указанный узел значение, описанное в строке
void Add(Node root, char * s)
{
if (s[0] == '0') //Это левый потомок
{
if (!root->left) root->left = newNode(); //Если потомка не было - создать
Add(root->left, &s[1]); //и добавить остаток строки в потомка
return;
}
if (s[0] == '1') //Это правый потомок
{
if (!root->right) root->right = newNode();
Add(root->right, &s[1]);
return;
}
//Это не потомок, это значение
root->value = atoi(s);
}
typedef struct Node //"связанное представление"
{
int value; //Значение
Node left; //потомки
Node right;
} Node;
Node root = NULL; //Дерево (корневой элемент)
//Добавить в указанный узел значение, описанное в строке
void Add(Node root, char * s)
{
if (s[0] == '0') //Это левый потомок
{
if (!root->left) root->left = newNode(); //Если потомка не было - создать
Add(root->left, &s[1]); //и добавить остаток строки в потомка
return;
}
if (s[0] == '1') //Это правый потомок
{
if (!root->right) root->right = newNode();
Add(root->right, &s[1]);
return;
}
//Это не потомок, это значение
root->value = atoi(s);
}
> Если вы были преподом, то что бы спросили?
"Зачем вы пошли вайти? Есть же разные специальности - лес валить там"
Вот, возьми, ты уронил: ⚹⚹⚹⚹
Я считаю, это говно не работает и падает с переполнением стека. Согласны?
Аноны, кто работает, в какой области ваши проекты? Нравится или заебало, что проку нет?
Он спрашивал про то как заработать, лалка.
Аудио/видео оборудование. На, так сказать, критическом пути (собственно кодеки и обработка потоков) никаких примочек. Там довольно сильное байтоёбское колдунство с примесями асма, которое понимают несколько человек во всей компании. Зато обвязка вокруг (у софта ещё тысяча других близких и не очень функций) - пожалуйста, пользуйся всем чем душа пожелает. Недавно перешли на С++17.
Почему-то он при стандартной компиляции в g++ без флагов или с флагом -O0 делает мой код много поточным. В чем может быть загвоздка? Это только у меня так или у всех?
ISO 2020, Linux Arch
Что такое start_t?
Я поэтому и спрашиваю, потому что у меня при запуске бинарника код поточится и это фиксируется прогой htop
Чем? Не с целью доебаться пишу, прости интересно что есть в нём чего нет в условном дебиане?
винда в несколько потоков внутри Loader'a грузит всякие библиотеки в процесс, типа kernel32.dll, но потом эти потоки пропадают, и программа остается однопоточной.
Может в у тебя что-то подобное
Делай strace, красноглазик.
Обновляется гораздо быстрее deb-based дистрибутивов. В остальном тот же линукс, конечно.
Я очень бегло посмотрел
time ./a.out
У тебя тут сплошной ввод-вывод, и нагружено ядро, которое внутри использует потоки, или что-то еще в юзерспейсе, например, код эмулятора терминала
Ничем, не слушай этого говноеда, это говно постоянно какие-то проблемы только устраивает
Держи в курсе, красноглазик
... Кто не знает, так работала его мегатекстура, только даже она была чуть умнее - делала feedback pass сначала и находила все страницы в сцене, но все равно это был страшный тормоз. Останавливать GPU и грузить страницу по первому fault - будет тормознее на порядки.
https://kunaifusu.livejournal.com/566139.html
... Не стоит забывать, что CTO у них Кармак, который в железе ничего никогда не понимал.
https://kunaifusu.livejournal.com/550721.html
... Кармак задвинул очередную телегу о том, что ПС4 и Хуян - одно и то же.
У меня большая уважуха к этому поцану. Растянуть полдюжины шареварных платформеров в карьеру "Гуру 3Д" - никому больше не удавалось.
https://kunaifusu.livejournal.com/487221.html
... Кармака, который, оказывается, был CTO их Окюлуса - уволили! Это же великий гений, который буквально придумал всю 3Д графику, ай-ай-ай. Наверное, Цукерберг, все же, посчитал сколько бабла туда влили и сколько выхлопа получили. На Кармака лично ушло 500М+! А что в результате? В результате Кармак был замечен на пресс-конференции Майкрософта, с привязанным к морде телефоном Самсунг и рекламирующим Майнкрафт. Если бы я заплатил за такое 500М, я бы подумал, что меня наебали.
https://kunaifusu.livejournal.com/625042.html
... Я, лично, никогда не понимал как люди платили бабки за такое гумно. Не, на SNES это, наверное, круто было - 3д графичка все дела, однакож поиграв в Вольфенштайн я ничего нового от Ид не видел. Тем более Black Stone, сделаный на том же движке был куда круче.
Технически игры сами по себе ничего серьезного не представляли, движок - да, хороший движок, который можно было дать обезьяне и та что-нибудь смогла бы с ним сделать. А "3д грфичка" там была по самым нижним стандартам. Клоуны, ее делавшие, однако почему-то считались богами графики. ...
https://kunaifusu.livejournal.com/145499.html
Опять шизик помойку принёс.
Ищу бесплатное IDE под с++ для линукса, как VS CODE, только нужна ф-ция для дебага - Watch variable
Ф-ция, когда дебаг останавливается, если переменная меняется. Такое в VS Studio Было
Напомни хоть одну игру этого кинафусу, которую он продал в 90-х.
У меня такое подозрение, этот kunaifusu сам лично здесь ссылки постит на собственный блог, поглощенный лютой завистью к Кармаку. Он у него идея-фикс. Всячески хочет его очернить.
Наверное это потому, что kunaifusu нищеброд и доедает последний доширак - а у Кармака Ferrari водились уже в 90-х, когда этот хуй ещё в школу ходил.
Как бы ни для кого не секрет что Кармак не гений. И с Окулусом у него не вышло, и мегатекстуры из дума выпилили из-за багов.
Но разве это как то умаляет его достижения?
Грубо говоря пока все программисты болтались на 2-м уровне развития, он вышел на 3-й. И только тогда уже все увидели что так можно и тоже стали развиваться. Ну допустим он дошел только до 4-го уровня и это его предел. А другие пошли дальше, до 6-го, 7-го. Но что тут зазорного?
Часто высказывается мнение мол он ничего не изобрел. И быстрый обратный квадратный корень был до него известен и он просто позаимствовал его из научной работы, и вообще его 3д это просто проекции из геометрии, которые он в вузике только что проходил. И мол если бы он не сделал 3д, то это сделал бы кто-то другой.
Ну так а чего же не сделал? Вот и все. Кармак определил ландшафт, лицо компьютерных игр, на десятилетия вперед. История не знает слова "бы".
> чтобы точно понять как работает нужно самому покодить
Слава аллаху, хоть одна здравая мысль на весь тред
Он как бы говорит в самой первой копипасте выше по треду, что не Кармак страшен, а его тупые поклонники. К примеру, есть куча опенсорсных дураков, которые до сих пор копи-пастят его исходники, думая, что вот это-то и есть священный Грааль.
По поводу 3Д, ну это вообще пушка. Ты вообще в курсе, когда вышла PSX (Playstation(1)), и что у нее внутри стояло?
шизик с жжшечки, просто нахуй иди
>Ты вообще в курсе, когда вышла PSX (Playstation(1)),
Через год после Doom
>что у нее внутри стояло?
Говнецо с кривыми проекциями текстур и без z-буфера - по сути растянутые прямоугольные спрайты
Я не очень знаю первые 3д ps1-игры, но в 1994 там похоже был аналог вульфа3д, в лучшем случае - клон дума.
Да, до Кармака тоже уже пытались делать 3д игры - но они были или тупо векторными, или слайд шоу, или и то и другое. К примеру в 1986-87 были Sentinel и Driller на спектрумах, почти неиграбельные.
скиньте плиз обучалку как решить задачи пикрил на с++ с подробным обьяснением каждого шага
это не я решил, у меня другой пример, вот и прошу гайд с подробным описанием как решить так же, но другую задачу
Инструкция как в 9 строке заменить х+5 на х+6 или что?
360x360, 3:10
>template<typename... Args> void func(Args... args)
Как внутри неё сделать std::tuple из этих аргументов?
Когда откроешь для себя баш уйдёшь заявление о переводе на програмную инженерию писать.
Первый ответ в гугле же:
https://habr.com/ru/post/228031/
tl;dr std::make_tuple(std::forward<Args>(args)...);
С++ не предназначен для чего-то серьёзного. Пишешь на плюсах - баги обеспечены, причем не только логические но и те опечатки, которые прошли компиляцию. Недаром существуют 1000 и 1 всяких cpp-checkerов, потому что язык кривой
>С++ не предназначен для чего-то серьёзного
Сказал петушок, открывший двачик из браузера, написанного на С++
Банальный пример операции с векторами в пространстве. Типо у тебя есть класс Vector3 и чтобы каждый раз не писать кучу лишнего кода типа vec.x /= 3; vec.y /= 3; vec.z /= 3; перегружаешь деление и кайфуешь.
Учебник алгебры за 7 класс, читать всем.
А спустя 100 строчек ты не задумываясь ебашишь этот же оператор и потом 3 часа сидишь в поисках проблемы. Неужели я не прав?
Хуйню какую-то несёшь, если честно.
Не понял в чем проблема, перегруженный оператор это просто функция. Если ты какую-то левую функцию случайную вызвал то тоже 3 часа будешь искать проблему?
1920x1080, 3:35
1 строчка комментарий - все после // игнорируется
2 строчка подключает библиотеку для ввода вывода в консольке
3 строчка задает сокращение чтобы использовать все из этой библиотеки
5 строчка объявление главной и единственной функции программы
6 строчка начало этой функции
7 строчка объявление переменных икс и зед
8 строчка ввод из консольки в переменную икс
9 переменной зед задается значение равное матану справа
это не уравнение, а именно перезаписывание содержимого зед
10 вывод в консольку значения хранимого в переменной зед
11 конец функции и программы
Ну да, а твой js то предназначен, лол.
Ну это доебка типа второй раз ту же переменную объявил. Чтобы такого не было - собирай их все логически в одном месте класса, файла и т.д.
Сравни первые строчки. Считай что это заклинание, которые ты должен произнести богу-машине.
Алсо поскольку вы пользуетесь int, а не float, результаты могут весело округляться.
О, первый неосилятор чистого и понятного кода пошел. Уже все 100500 файликов полупустых поскроллил сегодня?
Уважаемый говношлепатель без кнопки enter, я портфель собирал в школу последний раз в районе 14 лет назад
>В каких вообще случаях может потребоваться перегрузка базовых операторов
Ну смотри:
1. Операции над векторами и матрицами. Любая мат либа
2. Конкатенация строчек или файловых путей.
3. Перегрузка -> в итераторах, смартпоинтерах
4. Перегрузка () в функторах или делегатах
5. DSL дристня для хитрой инициализации чего-нибудь типа как boost::program_option.
>где работает быдло которое это делает?
Как правило это делают разработчики всяких либ, ну или в каком-нибудь утилитарном классе. В пользовательском коде, баловаться таким наверное плохой тон. Прикольная же штука, когда сделоно нормально и в нужном месте, коммон.
>когда сделоно нормально и в нужном месте
Как-то читал про цепочку перегрузок -> с использованием той фичи, что если у возвращаемого значения оператора-> тоже переопределен орератор-> , то также сразу вызывается.
Короче вызов, a->foo() лочил мютекс, че-то еще делал и потом разлочивал.
Вот где настоящая шиза.
Такая параша никогда не пройдет код-ревью. Дело не только в том, что она нечитаемая и неидиоматичная.
Тут в первую очередь играют роль сугубо утилитарные свойства, значимые для командной разработки
1) Диффы при изменении этой хуйни будут кошмарные
2) Частично связано с п.1. Нет лимита на длину строк, т.е. смотреть это в тулах неудобно.
Код с таким уебанским форматированием априори не может быть простым и понятным. Какой-то пиздец просто, ты блядь код на дискетах хранишь или переносы платные? Раздели эту кашу на логические блоки хотя бы, уёба, нихуя ведь непонятно. Отступы же научился как-то ставить, хотя бы в 2 символа, значит какие-то зачатки интеллекта имеются. Потом уже можешь поупражняться называть переменные понятными названиями. Подтянешь математическую базу и возьму тебя джуном на 40к
Там каждая строчка логический блок, у тебя дефицит внимания что ли?
> возьму тебя джуном на 40к
Я бы тебя сам взял за 60к, но боюсь ты писать код не умеешь, а только воду лить в файлах.
/////////
//
/////////
Я прав?
>Нет лимита на длину строк
На экран влезает? Влезает.
> Диффы при изменении этой хуйни будут кошмарные
Наверное первое замечание по делу.
Конечно приятно что ты меня заранее оценил выше самого себя, уёба, но вот у меня вопрос: как ты с таким кодом на классы делишь? Просто есть сомнения, что ты хуяришь всё в 1 файл
Если там есть проблемы с новыми версиями, всегда можно поставить прыщеблядикс. Я тем не менее не рекомендую использовать ноутбуки. Даже при наборе кода в нормальной ИДЕ они будут переходить в режим "ахтунг, взлетаем!".
Классы занимают 7 и 8 строчку на видео.
А что надо по матеше кстати?
Только потому что разработчики шиндоус и юникода мудаки.
перегрузка базовых операторов считается одним из самых важных инструментов проектирования в крестах, наравне с шаблонами
Пишу свою первую базу даных на плюсах в качестве тренировки.
И соотвественно пытаюсь делать по учебнику разносить интерфейс в .h файлы, а декларацию в .cpp.
Но тут мне понадобилось в одном классе реализовать темплейтный метод. Я его объявил, задекларировал но компилятор начал ругаться довольно непонятной ошибкой. Погулив ее я увидел такое:
"That means that we cannot separate the interface in a separate header file, and that we must include both interface and implementation in any file that uses the templates."
оесть получается я не могу разнести по разным файлам определение и объявление темлпейтной функци? Может я что-то не так понял?
Алсо возможно мою проблему можно будет решить иначе.
Как можно иначе написать функции которая принимает аргументом лямбду?
"
Для того, чтоб компилятор мог сделать template instantiation, ему необходимо "видеть" defintion.
Поэтому просто так отделить template defintion не получится.
Есть несколько способов решить вопрос.
1. Просто оставить функцию в хедере.
2. Перенести definition в .inl файл и заинклудить его в конце хедера. Получится то же самое, что и в пункте один, но с разбиением на несколько файлов.
3. Воспользоваться explicit template instantiation. Это когда ты сам в той части кода, откуда доступен template instantiation указываешь те типы, для которых нужно сделать template instantiation. Все варианты имеют свои нюансы, тут нет одного лучшего.
>Как можно иначе написать функции которая принимает аргументом лямбду?
В каком смысле?
Как описать принимаемые аргумент?
Можно через function pointer, можно через std::function
Сука блядь ты русские слова забыл что ли? Пиздец БЛЯДЬ что ни слово то какой-то ебучий англицизм. Уёбок блядь, расстроил меня на пустом месте.
Спасибо за овет, хотя я и мало понял из того что ты сказал, буду гуглить.
про лямбду аргументом я имел ввиду такое:
Вот например у меня есть мап и я хочу для него написать некий аналог erase_if по предикату который может быть разным, назовем эту функцию remove_if.
Так вот я просто ничего не придумал умнее чем написать
template<typename Lambda>
void remove_if ( Lambda predicate);
может я просто тупой и не знаю как можно это иначе сдлеать.
>буду гуглить
Я на это и рассчитываю. Так лучше поймёшь.
>template<typename Lambda>
Нормально сделал
Но сюда заедет не только лямбда, а в принципе любой callable-object. Лямбда, функтор, function-pointer, etc.
>оесть получается я не могу разнести по разным файлам определение и объявление темлпейтной функци? Может я что-то не так понял?
Все ты можешь.
В хедере в классе пишешь например
template<class T> void f(T t);
В сурсе соответственно
template<class T> void ClassName::f(T t)
{ // }
Шаблоны в хедере только замусоривают интерфейс и нарушают инкапсуляцию.
> Шаблоны в хедере только замусоривают интерфейс и нарушают инкапсуляцию.
Не слушай его, нечего они не нарушают
я все понял
Лучше места не найдешь, где брать заказы
Для одного енума есть to_string функция, для другого — нет.
Сейчас я логирую енум так.
template<typename T, std::enable_if_t<std::is_enum<T>::value, int> = 0>
Logger& operator<<(T i) {
log(std::to_string(static_cast<typename std::underlying_type<T>::type>(i)));
}
А хочу вот так, но только в том случае, если to_string существует для этого енума. Если нет, то выводить первым вариантом (выше).
template<typename T, std::enable_if_t<std::is_enum<T>::value, int> = 0>
Logger& operator<<(T i) {
log(to_string(i));
}
Как это сделать?
Я тут недавно пилил проект, у которого часть имплементации на ассемблере
Сделал пачку класс-темплейтов, которыев зависимости от темплейт-аргумента набирают себе в constexpr-таблицу указатели на функции, написанные на ассемблере в отдельном файле
А затем этот класс уже между этими указателями разруливает, как ему операции выполнять
Когда оптимизировал это всё — посмотрел асм и optimization log — почти все функции (кроме слишком больших) заинлайнились в LTO. Было приятно
template<typename T>
Logger& operator<<(T i)
{
if constexpr (std::is_invocable<decltype(to_string), T>::value)
{
log(to_string(i));
}
else
{
log(std::to_string(static_cast<typename std::underlying_type<T>::type>(i)));
}
}
Это если, конечно же, C++ 17 поддерживается
Ставлю анус что компилятор из кода на си++ (конечно, нормально написанного) сделал бы ассемблер еще эффективнее чем рукописный.
Сначала так и сделал, но не знаю, как пробиться через ADL для выбора правильного scope (не работает с namespace)
https://godbolt.org/z/M15veK
Зато вариант с оверлоадами зашёл
https://godbolt.org/z/hvnoxs
В чём троллинг заключается?
хм, я вроде так и делал но ничего не компилилсоь
А это так же работает для метода класса а не обычной функции?
Возможно для метода класса мне надо темплейт до обьявления класса писать, или непосресдвтенно над методом?
Лучше Linux From Scratch.
Сэ ля ви, анон.
Я тебе и написал для метода класса, а не свободной функции.
Разбивай на логические блоки
Не, это я как раз понимаю. Но я хочу реализовать через отдельную функцию инициализацию объекта класса где юзер задаёт параметры в том числе и один из енама. Неужто такое не реализовать?
Нихуя не понятно, что ты хочешь сделать.
"Погроммист на Qt" в треде.
Есть кудахтер с core i5-7500, на котором я дома пишу код.
Меня напрягает скорость сборки даже небольшого проэкта на пару десятков тысяч строк.
Компилятор g++.
Кто-нибудь ради интереса пробовал собирать на многоядерных системах, типа двух Зионов E5-2678v3, насколько хорошо оно скалируется?
На али по прикидкам можно собрать комплект с мамкой/камнями/памятью, остальное докупить на месте и уложиться тыров в 50-55.
>Дык это на нём.
Земля тебе пухом, братишка. Ты на каком-то говне вроде юбунты или дикина изкаропки сидишь? Подрочи неделю генту, сможешь оптимизировать до такой степени что компы за тысячи баксов на шинде возьмут в рот.
Ты правда думаешь что мне не похуй на твоё мнение?
Факт в том, что у меня древний ультрабук на сабже работает шустрее стационарника с топовым райзеном на десятке.
Чего сказать то хотел?
Зеоны, по крайней мере, того поколения, которое дешево, раза в два медленнее современных процессоров, так что лучше брать нормальную современную мейнстримную систему вместо двухсокетника с помойки
> Проблема только в том, что мне хочется увеличить скорость сборки.
Давай ТТХ своей сборочной системы:
-сколько проектов
-сколько в среднем файлов в проектах
-сколько сейчас длится сборка
Некоторые проекты и на бесконечном числе ядер будут собираться с такой же скоростью, как одним ядром.
Собираю на i9 9900k с разгоном 5.0 ghz на всех ядрах, некоторые даже небольшие вещи собираются достаточно долго
Пруфов конечно же не будет
>-сколько проектов
Конкретно напрягает меня один проект.
Файлов ~350.
Собирается полторы минуты (за это время я успеваю отвлечься на какую-нибудь хуйню и залипнуть, проебав 5-10-15 минут).
Остальные проекты, с которыми я работаю, обычно мелкие программы, собираются быстро.
>>822519
Так-то да, я ради интереса пошерстил ютуб, в тестах два таких камня примерно как один 3900X-3950X, только он один стоит как мать+камни+память.
Программа, собранная mingw с ключом O3, начала падать. При этом если собирать её же с O2 или в дебаге, то она отрабатывает без падений и, на взгляд, без ошибок. Также работает нормально, если собрать в студии.
Что это вообще может значить и как с таким бороться?
Собирал с ним в 19-й студии, работает без ошибок.
> 486
Проект свой на файлы небольшие разбей ты, молодой падаван. Компилируй в объектный код их.
> падать
- падать как?
- у тебя говнокод (прогони через статические и динамические анализаторы)
- прога зависит от тонкостей IEEE и т.п.
- баг в кунпеляторе
UB скорее всего
> Собирается полторы минуты
Ну тогда не выёбывайся. Инкрементальные сборки у тебя всё равно должны быть очень быстрые.
мимо проекты собираются около полутора часов
Проверь порчу стека, или на куче удаление уже удаленного либо обращение к удаленному. есть инструменты для такого. Возможно возвращаешь указатель на локальную переменную.
> внёс правок на 20-30 строк, надо проверить, что всё работает. Каждый раз по полтора часа куришь бамбук?
Нет конечно, я о том и говорю, что инкрементальные сборки времени почти не занимают, а если у тебя после мелких правок собирается всё заново, то не в процессоре дело.
>Нет конечно, я о том и говорю, что инкрементальные сборки времени почти не занимают, а если у тебя после мелких правок собирается всё заново, то не в процессоре дело.
Ну я собираю в среде разработки QtCreator.
Я так понимаю, он просто чекает, были ли внесены изменения в некий файл. И если изменения были внесены, он тупо пересобирает все файлы, в которых изменённый файл используется. Поэтому зависит от того, какой именно я файл поправил.
>есть инструменты для такого
Типа Address Sanitizer?
Попробовал на FreeBSD скомпилировать на g++ и clang++ с -fsanitize=address, но в обоих случаях не возникло никаких ошибок.
это ты пытаешься записать что-то в неаллоцированную память, или стэк сломан
Похоже какие-то ошибки в моём mingw. Скомпилировал с помощью mingw с ключом -O3 на ноутбуке - всё работает.
Я только с такими знаком https://github.com/ofan/memcheck
https://github.com/seladb/MemPlumber
А как стек проверить не помню
на сис. админа, "Администрирование систем и сетей", хз почему нас учат с++ и писанию калькулятора на делфи 7
Что ты там забыл с 0 знаниями в информатике? И без знания английского ты на кой туда полез потому что знай ты английский хотя бы на B1 ты бы сумел прочитать ошибки конпилятора и исправить их. Изучение программирования хорошо тем, что определённому проценту людей из твоего потока оно поставит мозги на место и на выходе выйдут мало-мальски грамотные тела. И очень скоро у тебя и многих других развеется миф о том, что сисадмины - смузихлёбы со 100% автоматизацией и вы, скорее всего, отсеетесь что благо.
да я уверенный юзер пк, могу чинить итд, английский как раз примерно ниже среднего, ну не могу я кодить, тупо не интересно все эти операторы, переменные и др. термины программирования, на сис. админа поступал пушто думал нас будут учить только поддерживать работу серверов, инета и компов, а не этот кодинг злоебучий
Двачую.
>>823145
"Уверенный юзер пк" это моя бабушка. А ты хоть раз павершелл юзал? Рейд массивы собирал? TCP/IP знаешь, простой трафик netbios`a сниффнуть сможешь? Запросы сформируешь, логи прочитаешь? Про линуксы даже не спрашиваю. Кодить тебе так или иначе придётся, хотя бы простенький скрипт на баше или не дай бог шелле но где-нибудь да понадобится написать. А не станешь учить потом у тебя гарантированно возникнут вопросы типа "А почему 777? Гыы, Линус, нормальная такая интеграция".
Админу, желающему получать больше 25к в местной школе, необходимо хотя бы общее знание скриптовых языков.
Сложность твоей задачи настолько низкая, что ты бы уже успел сам найти книжку страуструпа для вката, прочитать 15 страниц и выполнить задачу. Но ты почему-то решил, что срать в этом треде тебе более предпочтительно.
>>823152
Ладно. К счастью для нас обоих я двачер с маленьким стажем, потому постараюсь реабилитроваться из статуса токсика.
На вот, это для формирования общей картины с чем тебе предстоит иметь дело: https://www.youtube.com/playlist?list=PLmxB7JSpraiep6kr802UDqiAIU-76nGfc
По твоему вопросу - https://ravesli.com/urok-53-prostranstva-imen/
Только вникни и пойми почему так. И учись учиться + гуглить, за тебя это никто делать не будет.
> По твоему вопросу - https://ravesli.com/urok-53-prostranstva-imen/
глянул я, там другое, а мне надо научиться пока решать простые матем. задачи
Там в точности описано что нужно делать чтобы твой код заработал.
Удаляешь инклуд строки, после пишешь using namespace std;
Всё что в мейне табулируешь, в конец добавляешь return 0;
Если проверка на деление на ноль не требуется то задание ты выполнил.
окей спасибо попробую
Нет, я заново скачал mingw, и теперь всё работает без ошибок.
Потому чта:
1. си/си++ это языки наиболее близкие к железу, после ассемблера. Тебе бы надо знать как работает комп и программы на нем, на таком уровне - читает переменную, складывает с другой, записывает в перемнную.
Это нужно хотя бы для понимания сетевых протоколов - они же не из воздуха берутся, а вот так гоняют байты по порядку.
2. си/си++ это всякие линуксы, которые наверняка придется ковырять, например я даже дома изменял и собирал прошивку для роутера. Если будешь админить какой нибудь хайлоад, наверняка придется оптимизировать какие то штуки, как минимум выделение памяти.
3. большинство уязвимостей связаны с ошибками в си/си++ программам, например переполнение буфера, так что надо бы понимать откуда оно берется, что именно происходит в программе почему буфер портится.
4. Как уже написали придется работать со скриптами, башем, батниками, павершелом и т.д. Основные принципы программирования сохранятся, отличаться будет только обвзяка и свистелки (пока это не хаскель)
Каков пиздец.
Впрочем, с шаблонодрочером на VS2008 и C++03 с моей текущей работы не сравнится.
C++03 в студии это ещё по божески.
мимо пишу на c++98 в эклипсе для одного хобби-проекта под qnx
>А почему на твоей работе VS2008 и C++03 ?
Сейчас всё норм.
Но был чел, код которого был написан в начале 10-х на сабже чисто на шаблонах (потому, что чел прочитал Александреску и впечатлился) и собственных костылях для той же многопоточности (хуле, std::thread не завезли ещё).
И я этот код немного ковырял и просто охуевал.
В перфокарты умеешь? Хуи сосёшь?
warning C4291: 'void operator new(std::size_t,void ) noexcept': no matching operator delete found; memory will not be freed if initialization throws an exception
Но при этом соответствующий operator delete я сделать не могу, ведь это placement new.
Насколько безопасно это игнорировать?
Visual Studio 2017 на этот же проект такую ошибку не выдает.
Помогите бесплатно получить русский вариант книги по AMP
"C++ AMP. Построение массивно параллельных программ с помощью Microsoft Visual C++"
Ты не подумай, на работе я c++17 /permissive-
>>823805
>>823784
Пишу клиент для имиджборд для Blackberry OS10.
RIM предоставила NDK, в комплекте есть gcc 4.6.3 и 4.8.3. По умолчанию 4.6.3, хотя всё равно на 4.8.3 стандартная GUI библиотека скорее всего собрана без c++11. В интернете информации по этому поводу практически нет, на гитхабе проектов с этим флажком тоже нет.
Вручную писать красивый интерфейс на голом и древнем Qt не очень хочется, поэтому вот терплю.
Если у кого-нибудь есть информация, которая может облегчить мои старания, делитесь пожалуйста. Спасибо.
>Ты не подумай, на работе я c++17 /permissive-
Какой опыт? Что пишешь и где? Сколько учился, через сколько вкатился? Какая зп? Нравится?
>Ты не подумай, на работе я c++17 /permissive-
Какой опыт? Что пишешь и где? Сколько учился, через сколько вкатился? Какая зп? Нравится?
Пишу разное, высоконагруженные серверные системы, сети, немного криптографии и безопасности. На работе в основном c++14, три года опыта, 150к.
Очень нравится, но хочу больше денег. Попутно пилю потенциально профитный жирный проект, но больше денег хочу уже сейчас.
Другой анон
Неплохо. Только на крестах пишешь или ещё на чём-то? Что за проект? Хотя бы в 2 словах.
> Какой опыт?
Джва с половиной года
> Что пишешь и где?
САПРы nuff said, где не скажу
> Сколько учился, через сколько вкатился?
Устроился на втором, шарагу бросил на третьем. В общем где-то год написания разного рода laba2.cpp и ещё год написания синтетических разного рода крудов и редакторов неба и аллаха (laba6.h laba6.cpp main.cpp)
> Какая зп?
120к
> Нравится?
Да, очень
Типо либа скомпилена уже на старой верии, а исходников чтоб перекомпилировать нет?
Да
Старая либа даже с исходниками может не собраться, а еще семантика языка менялась поэтому она собравшись может делать не то что раньше.
https://stackoverflow.com/questions/63290846/have-there-ever-been-silent-behavior-changes-in-c-with-new-standard-versions
Много ручной работы.
Только учи блять, я проверю!
Сейчас пишу на питоне, в инсте был один курс плюсов уровня хэлоуворд.
Написал кастомный аллокатор с интерфейсом под std::allocator
Написал кастомные make_unique и make_shared, которые используют мой аллокатор и CustomDeleter, который деаллоцирует с помощью моего аллокатора.
C shared_ptr проблем не было.
Но у unique_ptr deleter это часть типа, а не объекта, поэтому при вызове CustomDeleter не получится корректно удалить дочерний полиморфный объект, имея указатель на родительский объект. Деструктор вызовется правильно, а вот память нормально не освободить, так как неизвестен размер объекта.
Понял, что избрал не совсем верный подход. Узнал, что у полиморфных объектов два деструктора, один просто деструктор, а другой для динамической деаллокации, который зовётся как раз тогда, когда происходит вызов delete на полиморфный объект. В итоге вызывается "второй" деструктор через dynamic dispatch, где внутри уже overloaded delete, так как тип объекта уже определён.
Поэтому для корректного поведения достаточно не вызывать dellocate из CustomDeleter, а сделать просто delete (или вообще оставить дефолтный deleter).
А вот в оверлоаде delete уже сделать deallocate с указанием размера.
НО НЕ ТУТ-ТО БЫЛО
g++/clang не позволяет сделать один overload delete, но не сделать второй.
Более того, нет гарантии, что будет вызван один а не другой.
Это не позволяет сделать им универсальное поведение (а именно — не хранить размер аллокации перед каждым аллоцированным блоком).
Хотя при этом g++ всегда зовёт именно sized-version.
clang тоже, но требует для этого -fsized-deallocation
Единственная ситуация, при которой я смог триггернуть вызов non-sized delete — это вызов delete на pointer-to-incomplete-type. Тогда-то компилятора размер и неизвестен. Но эта тест бесполезный, ведь вызов delete на pointer-to-incomplete-type — это UB и потребовало включить игнор ворнинга.
В итоге красивого выхода из ситуации я не нашёл
Перый вариант:
1. Оформить нормально пару new/sized-delete с вызовами аллокатора с указанием размера напрямую.
2. Оформить пару new[]/delete[] с хранением размера аллокации в дополнительном блоке.
3. Вызов sized-delete[] оформить так же, как и delete[]. Проигнорировать size.
4. Делать std::terminate() в случае вызова non-sized-delete, ибо нехуй. Либо он никогда не вызовется, либо я что-то не учитываю (поэтому и пишу это всё, вдруг кто подскажет).
Второй вариант:
Первые три пункта как в первом варианте.
4. В случае вызова non-sized-delete делать вызов deallocate с указанием какого-нибудь специфичного размера, например, -1.
В аллокаторе отдельно обрабатывать такой вызов. Вместо поиска чанка в готовой бочке (найденной по размеру), мы перебираем все бочки в поисках нужного блока для деаллокации. Потом деаллоцируем. Требует дополнительных костылей в деаллокаторе, но зато работает всегда. Но наличие этих костылей не ухудшает нормальный case (когда размер известен).
Собственно, стоит ли второй вариант того? Это долнительный костыли в обход стандартного интерфейса аллокатора ради того, чтоб избежать проблемы, которая может и не возникнуть.
Написал кастомный аллокатор с интерфейсом под std::allocator
Написал кастомные make_unique и make_shared, которые используют мой аллокатор и CustomDeleter, который деаллоцирует с помощью моего аллокатора.
C shared_ptr проблем не было.
Но у unique_ptr deleter это часть типа, а не объекта, поэтому при вызове CustomDeleter не получится корректно удалить дочерний полиморфный объект, имея указатель на родительский объект. Деструктор вызовется правильно, а вот память нормально не освободить, так как неизвестен размер объекта.
Понял, что избрал не совсем верный подход. Узнал, что у полиморфных объектов два деструктора, один просто деструктор, а другой для динамической деаллокации, который зовётся как раз тогда, когда происходит вызов delete на полиморфный объект. В итоге вызывается "второй" деструктор через dynamic dispatch, где внутри уже overloaded delete, так как тип объекта уже определён.
Поэтому для корректного поведения достаточно не вызывать dellocate из CustomDeleter, а сделать просто delete (или вообще оставить дефолтный deleter).
А вот в оверлоаде delete уже сделать deallocate с указанием размера.
НО НЕ ТУТ-ТО БЫЛО
g++/clang не позволяет сделать один overload delete, но не сделать второй.
Более того, нет гарантии, что будет вызван один а не другой.
Это не позволяет сделать им универсальное поведение (а именно — не хранить размер аллокации перед каждым аллоцированным блоком).
Хотя при этом g++ всегда зовёт именно sized-version.
clang тоже, но требует для этого -fsized-deallocation
Единственная ситуация, при которой я смог триггернуть вызов non-sized delete — это вызов delete на pointer-to-incomplete-type. Тогда-то компилятора размер и неизвестен. Но эта тест бесполезный, ведь вызов delete на pointer-to-incomplete-type — это UB и потребовало включить игнор ворнинга.
В итоге красивого выхода из ситуации я не нашёл
Перый вариант:
1. Оформить нормально пару new/sized-delete с вызовами аллокатора с указанием размера напрямую.
2. Оформить пару new[]/delete[] с хранением размера аллокации в дополнительном блоке.
3. Вызов sized-delete[] оформить так же, как и delete[]. Проигнорировать size.
4. Делать std::terminate() в случае вызова non-sized-delete, ибо нехуй. Либо он никогда не вызовется, либо я что-то не учитываю (поэтому и пишу это всё, вдруг кто подскажет).
Второй вариант:
Первые три пункта как в первом варианте.
4. В случае вызова non-sized-delete делать вызов deallocate с указанием какого-нибудь специфичного размера, например, -1.
В аллокаторе отдельно обрабатывать такой вызов. Вместо поиска чанка в готовой бочке (найденной по размеру), мы перебираем все бочки в поисках нужного блока для деаллокации. Потом деаллоцируем. Требует дополнительных костылей в деаллокаторе, но зато работает всегда. Но наличие этих костылей не ухудшает нормальный case (когда размер известен).
Собственно, стоит ли второй вариант того? Это долнительный костыли в обход стандартного интерфейса аллокатора ради того, чтоб избежать проблемы, которая может и не возникнуть.
>>824797
>книга страуструпа
Бляяять, нет. Если совсем зелёный - то лучше сначала пройти K&R по чистому Си. Книга Страуса - это спидран в котором новичок потеряется. Вот ты учишь объявление переменных и вот ты уже пишешь калькулятор с 10 неймспейсами и кучей вложенных юзертипов и ловишь конфликты имён по 100 штук на вызов.
Си - худший возможный совет. Си - это устаревший нахуй никому не нужный, кроме шизоидов и дедов кусок говна.
Я знаю 1 юзкейс использования си - когда под твое говно компилятора C++ нету. Да и вообще нихуя нету, кроме си.
Во всех остальных случаях си нахуй не нужен. Да, включая операционные системы\драйвера\HFT и прочее
а, ну да, еще стабильное сишное ABI забыл. Теперь точно все.
> сначала пройти K&R по чистому Си
Нихуя подобного, в этой книге как раз это объясняется. Сразу учи c++. А про калькулятор согласен, пиздец полный
у страуса годные книжки - "с++ специальное издание" 2000 года и "дизайн и эволюция языка"
еще он годные статейки иногда пишет))
а последние книги у него неудачные, особенно та книга типа для новичков
на 98 стандарте было интересней городить шаблончики для статики и метапрограммирования
в последних стандартах надобавляли синтаксического сахарку, а раньше нужно было трюки делать)
страус, специальное издание
в четвертом тоже много задачек, можно не читать, а брать только их
Пиши в КОМИТЕТ с такими охуеительными вопросами.
Сеньор, ты?
Труп страуса вводит в заблуждение, если честно. Уже в который раз читаю что поинтер к функции нельзя привести к void*. Но я могу..
Стандартом не разрешено. Причём тут то, что ты там можешь?
POSIX, кстати, разрешает, но только для free функций.
void lolcout(int x)
{
cout << endl << x;
}
void u = &lolcout;
((reinterpret_cast<void(*)(int)>(u)))(128);
Зато я твою маму ебал
разве что на машинах где данные и код отдельно хранятся. но в целом скорее можно чем нельзя
А я могу в свитче писать case 5...55: но стандарт это никак не меняет.
Что-то вроде:
Описание метода класса: void имя_класса::имя метода()
{
имя_класса::имя_другого_метода(какая-то переменная, та переменная_которая_ вызывает_первую_функцию)
...
}
Кастить в указатель на функцию как раз можно.
Потому что енам в классе - это тот же енам, а вот функция-член класса, пусть и статическая, - это не то же самое, что и глобальная функция
В итоге методы класса не учитываются при adl в том примере с темплейтным принтом енума?
Ссылки, лямбды.
Задали реализовать алгоритм шифрования ГОСТ 28147-89.
Проблема в том, что программа шифрует, но вот назад не расшифровывает правильно даже один блок.
Не могу понять с чем я проебался, надеюсь на помощь.
С меня как всегданихуя.
https://pastebin.com/Khti8mvJ
Ну ищи ошибку, чо.
else if (this->mode == SIMPLEENCRYPT)//Режим дешифровки
Уверен?
Это зачем?
Почему у меня для raw pointers производительность выше?
#include <iostream>
#include <chrono>
#include <memory>
using namespace std;
using namespace std::chrono;
#define TIMEUNIT high_resolution_clock::time_point
#define TIMENOW high_resolution_clock::now()
#define TIMESECONDS(x) duration_cast<seconds>(x).count()
#define TIMEMICROSECONDS(x) duration_cast<microseconds>(x).count()
const size_t size_x = 300;
const size_t size_y = size_x;
const size_t windows_x = 10;
const size_t windows_y = windows_x;
int main()
{
// unique pointer test
{
size_t number_of_operations = 0;
unique_ptr<bool[]> mask = unique_ptr<bool[]> (new bool[size_y size_x]);
unique_ptr<bool[]> mask_local = unique_ptr<bool[]> ( new bool[(windows_x 2 + 1) (windows_y 2 + 1)]);
TIMEUNIT t1 = TIMENOW;
for(int i = 0; i<size_y; i++)
for(int j = 0; j<size_x; j++)
mask[i size_x + j] = ((i+j)%2) == 0;
for(int i = 0; i<size_y; i++)
for(int j = 0; j<size_x; j++)
{
int ii0 = i - windows_y;
if(ii0<0) ii0 = 0;
int ii1 = i + windows_y;
if(ii1>size_y) ii1 = size_y;
int jj0 = j - windows_x;
if(jj0<0) jj0 = 0;
int jj1 = j + windows_x;
if(jj1>size_x) jj1 = size_x;
for(int ii = ii0; ii< ii1 ; ii++)
for(int jj = jj0; jj< jj1 ; jj++)
{
mask_local[(ii - ii0)(windows_x 2 + 1) + jj - jj0] = mask[iisize_x + jj];
number_of_operations++;
}
}
TIMEUNIT t2 = TIMENOW;
cout<<"Unique pointer: "<< TIMEMICROSECONDS(t2 - t1)/1000.0/1000.0 << " sec" << "; nop = " << number_of_operations << endl;
}
// raw pointer test
{
size_t number_of_operations = 0;
bool mask = new bool[size_y size_x];
bool mask_local = new bool[(windows_x 2 + 1) (windows_y 2 + 1)];
TIMEUNIT t1 = TIMENOW;
for(int i = 0; i<size_y; i++)
for(int j = 0; j<size_x; j++)
mask[i size_x + j] = ((i+j)%2) == 0;
for(int i = 0; i<size_y; i++)
for(int j = 0; j<size_x; j++)
{
int ii0 = i - windows_y;
if(ii0<0) ii0 = 0;
int ii1 = i + windows_y;
if(ii1>size_y) ii1 = size_y;
int jj0 = j - windows_x;
if(jj0<0) jj0 = 0;
int jj1 = j + windows_x;
if(jj1>size_x) jj1 = size_x;
for(int ii = ii0; ii< ii1 ; ii++)
for(int jj = jj0; jj< jj1 ; jj++)
{
mask_local[(ii - ii0)(windows_x 2 + 1) + jj - jj0] = mask[iisize_x + jj];
number_of_operations++;
}
}
TIMEUNIT t2 = TIMENOW;
cout<<"Raw pointer: "<< TIMEMICROSECONDS(t2 - t1)/1000.0/1000.0 << " sec" << "; nop = " << number_of_operations << endl;
delete[] mask;
delete[] mask_local;
}
return 0;
}
Почему у меня для raw pointers производительность выше?
#include <iostream>
#include <chrono>
#include <memory>
using namespace std;
using namespace std::chrono;
#define TIMEUNIT high_resolution_clock::time_point
#define TIMENOW high_resolution_clock::now()
#define TIMESECONDS(x) duration_cast<seconds>(x).count()
#define TIMEMICROSECONDS(x) duration_cast<microseconds>(x).count()
const size_t size_x = 300;
const size_t size_y = size_x;
const size_t windows_x = 10;
const size_t windows_y = windows_x;
int main()
{
// unique pointer test
{
size_t number_of_operations = 0;
unique_ptr<bool[]> mask = unique_ptr<bool[]> (new bool[size_y size_x]);
unique_ptr<bool[]> mask_local = unique_ptr<bool[]> ( new bool[(windows_x 2 + 1) (windows_y 2 + 1)]);
TIMEUNIT t1 = TIMENOW;
for(int i = 0; i<size_y; i++)
for(int j = 0; j<size_x; j++)
mask[i size_x + j] = ((i+j)%2) == 0;
for(int i = 0; i<size_y; i++)
for(int j = 0; j<size_x; j++)
{
int ii0 = i - windows_y;
if(ii0<0) ii0 = 0;
int ii1 = i + windows_y;
if(ii1>size_y) ii1 = size_y;
int jj0 = j - windows_x;
if(jj0<0) jj0 = 0;
int jj1 = j + windows_x;
if(jj1>size_x) jj1 = size_x;
for(int ii = ii0; ii< ii1 ; ii++)
for(int jj = jj0; jj< jj1 ; jj++)
{
mask_local[(ii - ii0)(windows_x 2 + 1) + jj - jj0] = mask[iisize_x + jj];
number_of_operations++;
}
}
TIMEUNIT t2 = TIMENOW;
cout<<"Unique pointer: "<< TIMEMICROSECONDS(t2 - t1)/1000.0/1000.0 << " sec" << "; nop = " << number_of_operations << endl;
}
// raw pointer test
{
size_t number_of_operations = 0;
bool mask = new bool[size_y size_x];
bool mask_local = new bool[(windows_x 2 + 1) (windows_y 2 + 1)];
TIMEUNIT t1 = TIMENOW;
for(int i = 0; i<size_y; i++)
for(int j = 0; j<size_x; j++)
mask[i size_x + j] = ((i+j)%2) == 0;
for(int i = 0; i<size_y; i++)
for(int j = 0; j<size_x; j++)
{
int ii0 = i - windows_y;
if(ii0<0) ii0 = 0;
int ii1 = i + windows_y;
if(ii1>size_y) ii1 = size_y;
int jj0 = j - windows_x;
if(jj0<0) jj0 = 0;
int jj1 = j + windows_x;
if(jj1>size_x) jj1 = size_x;
for(int ii = ii0; ii< ii1 ; ii++)
for(int jj = jj0; jj< jj1 ; jj++)
{
mask_local[(ii - ii0)(windows_x 2 + 1) + jj - jj0] = mask[iisize_x + jj];
number_of_operations++;
}
}
TIMEUNIT t2 = TIMENOW;
cout<<"Raw pointer: "<< TIMEMICROSECONDS(t2 - t1)/1000.0/1000.0 << " sec" << "; nop = " << number_of_operations << endl;
delete[] mask;
delete[] mask_local;
}
return 0;
}
Значит у меня INTEL компилятор сломан на машине
$ sh command_line.sh
Results for ICPC
Unique pointer: 8.98449 sec; nop = 9506250000
Raw pointer: 1.36868 sec; nop = 9506250000
Results for GCC
Unique pointer: 0.763707 sec; nop = 9506250000
Raw pointer: 0.752126 sec; nop = 9506250000
$ vi command_line.sh
#!/bin/bash
echo "Results for ICPC"
icpc --std=c++11 -Ofast cc_raw_uni.cc -o run_new
./run_new
echo "Results for GCC"
g++ --std=c++11 -Ofast cc_raw_uni.cc -o run_new
./run_new
В ойсемблер погляди.
Да
Понял, спасибо
Просто сделай как в fmtlib сделано, будет проще и тебе и остальным. https://fmt.dev/latest/api.html#formatting-user-defined-types
tl;dr специализируй структуру, в которой и хранится метод to_string
Недавно смотрел одну презентацию Тита Винтера, в которой он говорил, что у языка большая проблема, если в библиотеках люди отказываются от простого написания свободных функций из-за угрозы огрести от ADL.
Какая-то лаба002.
Ты лучше сделай чтобы это работало в рантайме: на вход подавался std variant с твоими енумами и выполнялись функции в зависимости от доступных операций.
Ладно, лаба003
По моему из за подобной хуйни добавили полиморфические аллокаторы, посмотри может тебе подойдет.
#define ++ --
Потому что тупо текстовая замена без контекста, типов не видит, нихуя не видит.
Как тебе такое
#define SQR(x) (xx)
SQR(2+3)
2+3>11 //а не 25, так как развернулось в 2+3
Или например
#define STEP() x++; y++;
int x=y=0;
if(false)
STEP();
return y; //бабах - y++ сработает всегда
Макросы в плюсах калл
С появился в помощь низкоквалифицированных мартыхам, для которых ассемблер слишком опасный инструмент, хотя мощный и простой в реализации.
Макросы (как и разделение на хедеры/исходники, да и вообще вся система компиляции C) - хак, потому что в маломощный PDP-11 нельзя было завести нормальные компилятор с линкером. Прости, анон, но это так.
Не особо то и мощный - многие хотелки не получится реализовать.
Как мне сделать диспатч по типам в зависимости от типа данных, который является параметром макроса (т.е. подставить разный код для разных типов)? А если макрос использует другие, которым тоже не помешал бы диспатч по типам?
"Настоящий программист" - это кто? Покажь, что написал.
Лол, сначала не увидел, кому ты отвечаешь, и не много охуел с того, что ты просишь реализовать.
> диспатч по типам в зависимости от типа данных
Не нужно. Ты знаешь тип в точке вызова - ты вызываешь нужную версию макроса. Результат: невозможен код, который разворачивается хз во что (обычная болезнь ++С).
> макрос использует другие
#define iprint(x) printf("%d\n", x)
#define wrap(x) do{ x; }while(0)
#define twice(f,x,y) wrap(f(x);f(y))
#define iprint2(x, y) twice(iprint,x,y)
int a = 9;
ofstream fn;
fn.open("(тут должно быть значение а).txt");
как мне это сделать?
Всмысле 9.txt или a.txt?
0\10 тралинг, попробуй получше.
И зачем это малочитаемое говно? Это выглядит не по ХАКЕРСКИ МАМ Я СМАТРИ КАК МОГУ - это неподдерживаваемое error-prone дерьмо
По стандарту main это единственная функция, в которой можно не писать return - тогда будет подразумеваться, что return 0. Нахуя так сделали - без понятия.
два чаю анону
Пусть у меня есть некоторая шаблонная логика, которая, помимо всего прочего, проверяет значения на вхождение в диапазон допустимых (происходит конверсия из более широкого типа) перед кастом.
Как мне получить численные значения диапазона для данного типа? С шаблонами я могу использовать std::numeric_limits<T>::min/max(). Как мне это сделать в макросах без того, чтобы я везде протаскивал диапазон?
Это самый простой пример из того, что я имею в нашей кодовой базе.
Вот тут шаблоны мощнее. Но когда компилятор поддерживает что-то вроде typeof, то можно получить этот эффект. А вообще, зачем? Наверняка ваш код можно переписать без этого.
Как мне из typeof() получить численные значения диапазона (ну да, есть хаки, которые основаны на ~(typeof(T)0 и (T)-1 < 0), но это просто удачно можно задействовать арифметику в данном конкретном смысле). Мы говорим об общем принципе построения кода, который позволяет обойтись без бойлерплейта в каждом из call sites, где применяется шаблонный код.
* в данном конкретном случае, ~(typeof(T)0)
>А вообще, зачем? Наверняка ваш код можно переписать без этого.
Следуя этой логике, нужно избавляться от всего лишнего. Вообще любую программу можно написать с помощью только while и if, остальное не нужно.
Не нравится, спи красавица
По линукс-вей, подразумевается что у тебя много маленьких программок, выполняющих простые действия. Они общаются между собой через пайпы (грубо говоря stdout одной подается на stdin другой).
Но кроме этого программа может завершиться с ошибкой. Код ошибки 0 традиционно означает отсутствие ошибки, ну и соответственно, отсутствие return из main подразумевает что твоя программа отработала штатно.
Так вот она какая, денува.
Как в c++ хранить и делать арифметические операции с большими числами с помощью стандартных библиотек?
Например, сумму всех 10 значных цифр (От 1000000000 до 9999999999)
Нафиг не нужны.
Через строки, конечно.
Что-то из этого
1. Использовать готовую библиотку для работы с длинными числами.
2. Написать свой инструментарий для работы с длинными числами.
3. Если не требуется производительность, то достаточно примитивного подхода с хранением значений разрядов в виде символов строки.
Спасибо, капитан. Вопрос был - почему кнопелятор требует объявлять тип main, но не требует вовзарщать значение.
1. Кто знает, почему такое исключение сделали?
2. Зачем требовать int, если можно сделать еще исключение и разрешить void или ничего?
>1. Кто знает, почему такое исключение сделали?
Так получилось ради совместимости с сями, в которым это стандартизировано ради старых долбанутых компиляторов. Конечно это можно было оставить на откуп конкретным имплементациям и сделать это как compiler extension, но Комитет мыслит не идёт простыми путями. Только недавно Корентин Жабо убедил комитет, что не надо создавать своё надмножество Юникода (причина: вдруг появятся новый набор символов не в Юникоде, нужно же нам быть готовыми к такому).
Потому что автор еблан. Нормальные люди пишут auto a = type();
Пиздец конечно, решил сменить работу, нашёл просто прекрасную вакансию, но объективно понимаю, что как бы я не знал С++, без всей вузовской математики, которую я естественно проебал на первых курсах, я им нахуй не нужен. До того чё-то стало грустно, аж внутри нехорошо.
Можешь посоветовать, как изучать всё это дело лучше всего?
Не знаю, мы математику особо не требуем. Обычно достаточно школьного уровня. Гораздо важнее, чтобы ты умел решать задачи на c++, потому как непосредственно математика - это всего лишь процентов десять из того, что тебе придется писать. Всё уже до тебя написано.
Да хотя бы первые курса 2 освой. Не скажу что там трудно. Просто надо быть упёртым.
А в чем проблема объясни мне, а то я не понимаю. В if их же можно сравнивать.
Да и при чем тут типы с точкой? А если мне, например, строки нужно сравнить?
Проблема в том, что строго сравнивать( через ==) типы с точкой не кошерно, поскольку они могут отличаться на очень маленькое число из-за округлений. Особенно, если они получены разными путями.
Начал гуглить о том как оно работает тут проясняется общая идея
https://www.cyberforum.ru/blogs/18334/blog91.html
Грубо говоря мы преобразуем число в некий адрес и переходим по нему без сравнения со всеми остальными.
>А если мне, например, строки нужно сравнить?
В с11 вроде как завезли. Тут разбор работы.
https://habr.com/ru/post/166201/
Возможно в моих рассуждениях есть ошибки, надеюсь старшие товарищи поправят.
Но всё равно попросили сделать так, чтоб новая реализация могла работать не только Windows/Linux x64 с привязкой к процессору.
Сейчас оно тоже работает, но в случае несовместимости (другая ось, другая битность, другой процессор) переключается на Fallback-имплементацию, значительно менее производительную.
Ну я не против, сел и реализовал на плюсах все те функции, которые ранее были только на ассемблере. Intel ASM используется там, где он поддерживается, а во все остальных случаях используются новые функции на плюсах.
Вот только производительность в этом случае падает в 10 раз, потому что без асма и интринсиков работать с длинной арифметикой невозможно. Ну, то есть, возможно конечно, но это всегда будет значительно медленнее, чем использование асма или интринсиков.
Конечно, круто, что в C++ 20 появился <bit> и теперь не нужно писать десять оберток над popcnt и прочими lzcnt, но вот если бы ещё иметь стандартные способы работы с carry-flag и _mulx_u64, то все заботты бы решились.
Вроде, как я понимаю, это значение хранится перед первым элементом массива в куче, однако, начинаю смотреть память и в упор не вижу ничего похожего, что я делаю не так?
На пике фиолетовое - как раз объекты в массиве в количестве трёх штук, но что до них, что после - дебажный мусор.
Возможно глупая идея, но подёргай длину массива, и посмотри на изменяющиеся переменные с помощью чит енджина.
Как ты думаешь, почему в векторе размер - это разность указателей? Почему в строке по крайней мере до недавнего времени хранят указатель и размер?
Контейнеры всё равно по умолчанию используют std::allocator, который хоть и получает длину в deallocate — в стандартной имплементации это (почти нигде?) не используется.
Из гарантированной пользы только знание того, для скольки объектов вызывать деструкторы.
Сделай fallback'и под разные процы, вынести в библиотеки с pure C API
std::allocator - обертка над malloc. malloc это обертка над какой нибудь парашей уровня HeapAlloc или чем-то там линуксовым.
Это все операционкой манажится
Вот именно. Но для построения более эффективных кастомных аллокаторов этот size всё же можно использовать, что и предполагается интерфейсом std::allocator.
Я прогнал тестик на своей системе, нашёл размер как раз перед первым элементом.
Заглянул в отладчике в delete[], оттуда в free, там увидел чтение как раз этого значение из памяти (с заметной овер-аллокацией)
Зачем вообще заниматься аллокаторостроительством, когда уже все построили за тебя?
Так можно про всё что угодно сказать
Благодарствую
Это implementation defined. Так что ищи как это устроено в твоём тулсете. (std::allocator, malloc, calloc, менеджер памяти операционной системы)
Я читал про них, честно говоря плохо понимаю, где и когда они могут быть нужны. Идея комбинирования разных аллокаторов в одной программе - странная. Я видел софт, где на старте выделяется 1 кусок в хипе, и далее 0 аллокаций. Я видел софт, где используется кастомный мималлок, я видел софт, где дефолтного new достаточно.
Но вот идейно разные аллокаторы в одном месте я еще не видел. Мож чего-то не понимаю.
> Даже не знаю, какой вывод я должен был по этим двум вопросам сделать? Что зависит от реализации?
Что в общем случае размер выделенной памяти тебе нужно запоминать самому.
А, так просто. Это более чем понятно, меня просто в какой-то момент зацепила полумагическая реализация delete[], вроде как и использую иногда, а как она понимает сколько именно нужно делитнуть - не знал
delete[] почти всегда в плане деаллокации реализован так же, как и delete, ему самому размер нужно знать только для того, чтоб правильно вызватть деструкторы для всех объектов массива.
При этом, если это массив примитивных типов или trivially_destructuble типов, то их деструкторы при delete[] не вызываются и размер массива компилятор больше не заботит. Он даже может начать вызывать operator delete[](void ptr) при наличии operator delete[](void ptr, size_t).
Но тот факт, что размер там всё равно может лежать перед первым элементом — используется как дедаль имплементации malloc-free.
То есть, если ты заоверлоадишь new/delete и new[]/delete[] (включая sized-версию), прибив там везде руками имплементацию, которая НЕ ЗАПИСЫВАЕТ размер перед первым элементом — у тебя delete[] всё равно будет работать, потому что компилятор не может гарантированно знать, что имплементация malloc/free/whatever хранит там размер, он не может на это полагаться, поэтому он дополнительно хранит где-то у себя размер ЕЩЁ РАЗ, чтоб знать, сколько деструкторов вызывать.
Ещё из этого вопроса можно почерпнуть всякое: >>824807
tldr:
1. Вызов delete[] с точки зрения языка должен вызывать деструкторы, так что он всегда знает размер. При этом он всё ещё может аналогично делать это с помощью over-allocation. А может и нет.
2. Имплементация operator delete[] может использовать allocator, производительность или работоспособность которого может зависить от того, известен ли размер. Это отдельный слой и он может быть связан, а может быть и не связан с первым пунктом.
Всё — это что?
Ты имеешь ввиду кучи готовых опенсорсных аллокаторов, которые можно без проблем втянуть в свой проект? Если да, то, в принципе, можно согласиться.
Или ты про то, что готовых new-malloc/delete-free должно быть и так достаточно?
Qt6 актуальнее для новых разработок. Выйдет 1 декабря.
Учи шарп в чем проблема? Он же проще
Если ты вкатыш - то вкатываться в С++ сейчас правда не стоит. Шарп\вебговно\девопс денежнее и проще
Но мне больше нравится c++, у него столько возможностей, производительность, лучшие программы написаны на нём
Пиши тогда
Тебя предупредили. Я в свое вкатывался ради именно этого, охуенный язык, можно пердолиться вообще через все, что угодно, скорость. И если бы не nvidia мой потолок был бы унылое говно на С++98 за 80к в моем мухосранске. Сейчас я понимаю, что с точки зрения уютненько пристроить свою жопку - лучше было бы учить любой другой язык, а, в идеале, вообще фронтэнд, ебись он конём
На первом курсе хватит и wandbox
Если тебе чистый компилятор нужен то gcc в помощь. Но учти там всё надо делать руками. Не думаю что тебе нужен именно компилятор, скорее ide.
А так visual studio возьми. Можешь взять свежую, можешь 08-ого году, у неё интерфейс более виндовый.
Вот с этого капитулировал
Где вы такое откапываете, я ебал. Живу в центре Гейропки на 6.5к рейхсмарок с 3 годами опыта. Сваливайте из рашки и снг говна как можно раньше, мой вам совет.
Спасибо. И тебе.
хех
Сойдет чтобы набить руку на шаблонах.
Проблема в том, что в реальном проекте ты за пол года можешь ни одного шаблона не написать
Вы видите копию треда, сохраненную 2 апреля 2021 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.