Это копия, сохраненная 30 марта 2021 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
⚹ https://github.com/sosachbot/cppthreadhat/wiki
Ответы на вопросы:
⚹ https://en.cppreference.com/w/
⚹ https://www.cplusplus.com/reference/
Для указателей: ⚹
Прошлый: >>1796605 (OP) (OP)
По возможностям интересует:
Адекватное автодополнение, как стандартной библиотеки, так файлов проекта.
Ну понятно дебаггер, желательно, чтоб можно было выставлять условия для брейкпоинта. Да и очень хотелось бы иметь возможность пробежаться по стеку вызваных функций.
Подсказка типа переменной, например когда используешь auto либо просто встретил по коду, чтоб не лезть в объявление.
Возможность работы с cmake.
Какие-нибудь более-менее удобные средства работы с гит.
Ну в принципи и все основное наверное.
Clion
Короче, немного подосвоил теорию по simple code и ravesli, но понял что это всё быстро забывается и нужно чтобы каждая тема сопровождалась практической задачей, с повторением предыдущей темы. Учебники в шапке для этого я так понимаю не подходят. Как быть? денех на курсы нет
Cock тебе за щеку, консолеблядь
если ты прямо серьезно хочешь вкатиться - то пиши код. Читателей тут полный двач, а код надо уметь писать.
И только попутно, совсем немного времени - стоит посвящать чтению. От себя скажу, что читал танненбаума и windows internals - имхо, хуйня. Гораздо лучше сделать самому какой-нибудь проект который тарабанит операционку, и разбираться с этим
Код я так или иначе простенький пишу, но все равно сам осознаю, что знаний в алгоритмизации не хватает.
> алгоритмы
Вот дофига же в Вики, с картинками и псевдокодом. А гугуль прям заваливает слайдами про деревья и прочее. Берешь и пишешь свою библятеку
Сначала вводные:
1. Компилятор MSVC, тулсет v141, стандарт С++17
2. Платформа - Windows, соответcвенно sizeof(wchar_t) == 2
Есть txt файл в кодировке UTF-16LE, BOM присутствует, концы строк - \r\n (\r и \n конечно тоже по два байта) . Могут присутствовать суррогатные пары utf-16 (когда один unicode codepoint кодируется не 16 битами а парой 16 битных значений из оговорённого диапазона)
Как его построчно прочитать?
По большей части, можно даже построчно не читать - лишь бы читалось правильное количество байт чтобы потом конвертить в другую кодировку через WideCharToMultiByte
wifstream inFile(L"file.txt"); //опционально с ios::binary
wstring line;
std::readline(inFile, line);
- не подходит - поток без codecvt facet читает по одному байту и конвертит каждый байт в wchar_t и получается фигня, кроме того останавливается посередине L'\n' начиная следующую строку с \0.
codecvt_utf16<wchar_t> помог бы, но во-первых он deprecated, во-вторых он не корректно конвертит суррогатные пары - потому что потоки могут только в преобразование N:1, и поэтому этот facet читает 4 байта, получает правильный codepoint и обрезает его по границе 16 бит (размер wchar_t)
Помог бы codecvt_utf16<char32_t> (тоже естественно deprecated), но MS его поломали - не сделали где-то dllexport и хер забили чинить (да и специализации потока для char32_t тоже нет).
Велосипедить разбор файла самому через IS_HIGH_SURROGATE и прочее крайне не хочется - можно легко проебаться.
Куда ещё посмотреть? Бустовские io потоки? (никогда их не использовал, и хотелось бы тут обойтись по возможности без буста) Pure C stdio? Может в Winapi что-то есть а я неправильно ищу?
Без рофлов, я учусь 2 недели.
А если нужно сравнить пару файлов в несколько кб весом?
Нет ты, что не так то?
винрар, который мы заслужили
Ты знаешь как вообще данные в компе хранятся? Ему похуй символ это или целое число. В конце концов он все равно циферки сверяет. Так зачем сначала эти циферки в число загонять, если можно просто символы сравнить сразу?
Считай весь файл в память и сконвертируй в массив 32 бит символов сам
>дин unicode codepoint кодируется не 16 битами а парой 16 битных значений из оговорённого диапазона
Это определяется первыми битами, несложно обработать.
А если строки в разной кодировке? А если перевод строки в одном случае виндовский в другом линуксовый?
Из всего на чем работал QT creator лучшая, ИМХО
Ты ещё скажи "а если юникод в разной степени нормализации"
Я конечно могу так сделать (а точнее, уже попробовал перед тем как задавать вопрос и мне не понравилось), но
>Велосипедить разбор файла самому через IS_HIGH_SURROGATE и прочее крайне не хочется - можно легко проебаться.
Диалектика почти
Ты что, Тоню не знаешь?
На каком году изучения крестов надо понимать этот код?
можно быть принципалом в FAANG, и не понимать этот код. Это адовая эзотерика, которую даже какой-нибудь Полухин не сразу распарсит
Ну первое как-то ещё легко воспринимается, остальное специфично конечно.
Первое, что тебе нужно понять на нулевом дне обучения, это то, что код должен быть всегда отформатирован, а не как на оп-пиках.
Сап, тут есть аноны имевшие опыт с qml? Пишу приложение мобильное на нём, почти написал весь ui, и готов но остались некоторые вопросы.
да ёпта, зашёл в андроид спросил, направили сюда, отсюда в жс, поликлиника ебучая
имхо, он выглядит как 100% гетеросексуал
я понимаю что анонимныц ресурс и можно оскорблять как угодно, но..
И мало того, он женат. Пересекался на конфах.
Используй vcpkg
вебкам уже и сюда добрался?
просто вгрызаешься в
шаблоны вандервуда
и
последнюю книгу майерса
часов 300 усиленной дрочки и все
читать и понимать будешь
если по 10 часов в день ебашить, то месяц
+10 часов спишь в полной темноте, 2 часа жрать, срать, дрочить
шапке миллиард лет
>если по 10 часов в день ебашить
то сдохнешь через месяц.
я не понимаю зачем люди пытаются впихнуть невпихуемое, типа вызубрить жабакор хортсмана за неделю, меня через час потянуло сжечь его, или записатся на курсы чтобы отдать дохуя денег и получить выгорание, ненависть к програмированию в целом и проблемы со здоровьем от переутомления, вместо того чтобы изучать язык в своем темпе, сорт мазохизма что ли такой.
Проиграл с оппиков.
Никогда раньше не встречал вариадик темплейты, даже не задумывался об их существовании
написал же, спишь 10 часов при этом
помимо еды и сранья, еще останеться 2 часа на чередование прогулки и силовой зарядки
в таком режиме можно год прожить
итого 3к+ часов в год
за три года 10к часов, а обычно 10к часов растягивают на 10 лет
10к часов это минимум, необходимый в том чтобы детально разобраться в некой сложной сфере деятельности, стать мастером
Про 10к часов правда - а вот про месяц неправда, мозг не сможет, там тупо не выстроятся связи. Да еще ему надо делать это в фоне, когда ты не думаешь о теме активно. Да еще кривая забывания, чтобы повторять первые темы. Так что ты быстро упираешься в предел понимания, пока какая то предыдущая тема не усвоится, ты с какой то сложности будешь видеть тупо буквы, не понимая что происходит. Да еще тебя на второй неделе блевать потянет от однообразия, что ты потом месяцами программирование видеть не захочешь. Кроме того узкий специалист подобен флюсу, так что надо еще какие то предметные области осваивать и вообще саморазвиваться. Вот так и выходит 5 лет.
простая физиология мозг в момент концентрации потребляет до 25% всей энергии организма и долго в таком напряжении работать не будет.
>Кроме того узкий специалист подобен флюсу
А других специалистов не бывает - либо он узкий, либо не специалист,а, в лучшем случае, мамкин эрудит по верхам.
>простая физиология мозг в момент концентрации потребляет до 25% всей энергии организма и долго в таком напряжении работать не будет.
Потому что мозг надо с детства было развивать, книжки там читать, головоломки решать всё свободное время, а не к быдлодрузяшкам во двор бегать в сифу и прятки играть.
Взрослый мозг ясен хуй уже не разовьешь, тут судьба только охранником в пяторочку, только хардкор.
и он все равно будет потреблять столько же и не хотеть работать, неважно как ты его развивал, а будешь заставлять его реально пахать по 10 часов в день через пару недель получишь нервное истощение, тревожность, бессонницу и депрессию, я говорю по своему опыту прошедшему через кранчи.
с такой аргументацией пройди в мвп тред, там такое любят.
Проблема в том что
НРАВИТСЯ != МНОГАДЕНЕГ.
МНОГАДЕНЕГ = ВОРОВАТЬ OR ВЬЕБЫВАТЬ, УМЕНЬШАЯ ПРОДОЛЖИТЕЛЬНОСТЬ ЖИЗНИ, ПРИЧЕМ БЕЗ ВАРИКА ИХ ПОТРАТИТЬ НА ТО ЧТО НРАВИТСЯ ПО ПРИЧИНЕ ОТСУСТВИЯ ВРЕМЕНИ НА СОБСТВЕННО ЖИЗНЬ
Именно по этой причине у звезд шоубизнеса пьянство разврат и наркотики - потому что жизнь есть только в трейлере в поездках от гига к гигу.
"BAD_WEATHER", "TIRED"
и набор правил вида
"BAD_WEATHER & TIRED -> BAD_MOOD"
, результат которых - новый факт. Факты и правила задаются из файла в рантайме. Результат работы программы - набор фактов
Вот над подобной задачей туплю, как это архитектурно реализовать красиво?
клаузы Хорна второго порядка
>>833934
могли бы поделиться вашими конфигами для них? с emacs я правда дел не имел, а вот вим обычный одно время использовал, правда в рамках typescript, ну честно заставить корректно работать автодополнение у меня не получилось, подсвечивал кучу слов нет носящихся к интерфейсам слов. Но пердолить конфиг до нормального состояния, это хз сколько времени удить нужно. А так бы попробовал зайдет или нет.
Просто FSM не подойдет?
Я не он, но отвечу.
Как мне кажется, из-за отсутствия событий и делгатов, сборщика мусора и рефлексии, при написании сколько-нибудь сложных гуёв приходится сооружать совершенно монструозные велосипеды или использовать чужие - MFC с его message map, Qt с signal/slot, что-то там ещё в UWP (не сталкивался лично, может не прав и там всё норм - а может похоже на шарп).
Зачем же вообще писать гуй на плюсах? Ну, бывает что по ряду причин шарп не подходит. Например, недопустим managed код (рантайм), или гуй связан с байтоеблёй, WinAPI, драйверами, COM и создание биндингов неуместно/неудобно.
Не, ну учить язык чтобы пилить красивые гуишки без вспомогательных средств это сильно. Такое реально достойно уважения + затраченного времени.
> Зачем же вообще писать гуй на плюсах?
Да, лучше взять очередное говно на электроне которое будет для примитивнейших программ жрать память как целая ОС.
Дак яи не спорю. А электрон (там же js?) чтобы побыстрее хуяк хуяк и в продакшн.
Пишу в свободное время свой ГУИ на плюсах, с использованием SFML правда, но потом заменю на опенГЛ или другую хуйню. Можете оценить зачатки моего говна
Мда, тебе бы основы дизайна пройти
Кстати, возможно ли сделать гуи одного приложения на Линукс который максимально повторяет все кнопки приложения на винде? Такой же крестик, шрифты, и т.д. На винде обратное видел - гтк выглядит прям как линуксовый
берешь getline и парсишь строку по символу '\t' судя по всему
grep, awk
>кто в этом вертится подскажите актуальность языка на ближайшие 10 лет
В ближайшие 10 лет он никуда не денется.
Вообще актуальна версия, что чем дольше язык живёт, тем дольше он будет умирать. Сейчас плюсы очень активно развиваются (быстрее чем когда-либо) и уходить не собираются.
Другое дело, что вкатываться в них долго и сложно. Особенно сложно искать первую работу.
и последующие, провел 5 лет на с++ и Qt, везде оказалось нужно STL я иду на хуй, на двух собесах дропнули, на третьем взяли на 90 т.р. и то им нужны были тупо любые программеры которые не слишком тупо излагали
>плюсы очень активно развиваются
Почему так, анон? С 90-x и 00-х то их популярность явно упала.
От мелкософта не хочу ставить, ботнет
С популярностью вопрос спорный.
Индустрия развивается, появляются новые ниши, старые перераспределяются.
Для некоторых задач появились более подходящие инструменты (а иногда эти инструменты специально развиваются в каком-то более профильном направлении).
За пределами отдельно взятой сферы про их технологии можно и не слышать вовсе. Если быть "в курсе", то в плюсовом мире постоянно что-то происходит, msvc бешеными темпами подпиливает фичи, чтоб соответствовать стандарту, иногда даже gcc с clang'ом не поспевают, комитет тоже трудится, на выступлениях много всего интересного обсуждается.
Ну то есть происходит всё то же самое, что и в любой сфере.
>>834977
У меня на первой работе вообще плюсов не было, на второй искали кого-нибудь на Си, я им половину собеседования рассказывал про плюсы, так и взяли.
>>834991
У них там в Qt свой мир со своей парадигмой, стандартной библиотекой и макросами
>>834985
>Какой посоветуете
Посоветую не плюсы, они под твои критерии не подходят.
Возьми шарп.
В синтаксисе есть общие элементы, но в целом языки достаточно сильно отличаются друг от друга.
>Не проблема
Если знаешь один, то разобраться в другом будет легче, но не более.
Концепции и модели использования всё равно будут отличаться, так что придётся получать опыт.
Я вообще два новых языка учу сейчас в добавку к имеющимся, но это занимает много времени. "Не проблема" - неоднозначное понятие.
Было стадо языков на которых можно писать быстро но некачественно. Плюсы сделали выводы и позаимствовали много концепций, позволяющих писать по современному, но чтобы все осталось прлизводительным.
>Я понимаю, но пытаюсь по возможности избегать софта проприетарного
Не будь шизоидом. Либо ты сидишь под соснолькой в ОпенБЗД, либо не парься. Весь мир, весь энтерпрайз, все правительства, все военки сидят под виндой. Но ты боишься, что товарищ майор запалит, что ты прон с конями смотришь.
Другие — это кто? Шарп никуда не уходит, джава никуда не уходит. Даже Си никуда не уходит.
Ну вот в каком-нибудь 2077 какой прок будет от жопаскрипта, питона, сукасярпа, явы?
Не знаю. И тебе не надо знать про 2077.
template<typename T>
void BufferObject::allocate(const std::vector<T>& data, DrawMode mode) { ... }
А после навалено это
// explicit template definitions for common OpenGL types
template void BufferObject::allocate<GLboolean> (const std::vector<GLboolean>& data, DrawMode mode);
template void BufferObject::allocate<GLbitfield>(const std::vector<GLbitfield>& data, DrawMode mode);
template void BufferObject::allocate<GLbyte> (const std::vector<GLbyte>& data, DrawMode mode);
и т.д. для, походу, всех всех/большинства стандартных OpenGLовых typedefов. g++ ругается:
error: duplicate explicit instantiation of 'void zrv::BufferObject::allocate(const std::vector<T>&, zrv::BufferObject::DrawMode) [with T = int]' [-fpermissive]
template void BufferObject::allocate<GLsizei> (const std::vector<GLsizei>& data, DrawMode mode);
и т.д. для 10 из 14 типов. Я правильно понял, что причина в том, что некоторые тайпдефы пересекаются? Что таки делать?
Смотри, где предыдущее объявление.
Если код не библиотечный, смотри кто написал и спрашивай у него, зачем он это написал.
Нет предыдущего объявления, похоже, что проблема в том, что
typedef int GLint
typedef int GLsizei
поэтому нет проблем с
template void BufferObject::allocate<GLint> (const std::vector<GLint>& data, DrawMode mode);
но на
template void BufferObject::allocate<GLsizei> (const std::vector<GLsizei>& data, DrawMode mode);
происходит то, что происходит
Удаляй лишнее тогда. или используй то, что тебе коноплятор предложил, -fpermissive, но где-то будет грустить один некочан
А Эксель перевод строки внутри поля воспримет?
Можете показать нормальные примеры натягивания Си-каши на современные кресты? Пердолю Вулкан и это пиздец. Всё зависит от всего, для нормальной инкапсуляции в классах надо везде лепить костыли, уже вчера словил цикличную зависимость в этом пиздеце и дебажил час. Как вообще работать с этим не в Си-стиле? В туториалах к Вулкану вообще в один класс сваливают портянки из 2к строк, выглядит как пиздец.
Я вот так примерно делал.
https://gcc.godbolt.org/z/oPMTqz
Если хочется как-то обернуть, придётся смириться с избыточным хранением хэндлов где попало.
Я оборачивал так, чтобы во-первых, не уйти сильно далеко от вулкана мои хэндлы напрямую кидаются в функции вулкановские из-за возможности неявно кастовать, во-вторых, чтоб деструкторы были, и чтобы всю многословность вулкана с кучей опциональных параметров скрыть куда-нибудь к хуям.
Неплохо, но...
Почему сишный интерфейс, а не официальный vulkan.hpp из SDK?
Почему не С++20?
Производительность не сосёт с таким?
Почему не .hpp? Хуй знает, наверное, я о его существовании даже не знал. Или знал, но почему-то выбрал сишку. Не помню.
Не с++20 потому, что писалось, когда ещё не с++20. Ну и рановато пока, я в следующем году буду всякое своё говно на двадцатые плюсы переносить.
Производительность -- это ты про исключения? В Release конфиге у меня на все функции навешивается noexcept, и проброс исключения заменяется std::terminate. Но я задумываюсь о том, чтобы это убрать, потому что вроде и с исключениями не сосёт.
А этот их vulkan.hpp хорош, зараза. Спасибо за инфу.
Я, оказывается, сделал то же самое, что и они. У меня в моей велосипедной либе это даже называется точно так же. Только чуть иначе работает.
UniqueHandle for automatic resource management
Vulkan-Hpp provides a vk::UniqueHandle<Type, Deleter> interface. For each Vulkan handle type vk::Type there is a unique handle vk::UniqueType which will delete the underlying Vulkan resource upon destruction, e.g. vk::UniqueBuffer is the unique handle for vk::Buffer.
For each function which constructs a Vulkan handle of type vk::Type Vulkan-Hpp provides a second version which returns a vk::UniqueType. E.g. for vk::Device::createBuffer there is vk::Device::createBufferUnique and for vk::allocateCommandBuffers there is vk::allocateCommandBuffersUnique.
Note that using vk::UniqueHandle comes at a cost since most deleters have to store the vk::AllocationCallbacks and parent handle used for construction because they are required for automatic destruction.
for(...) { int x = 1; }
> Что происходит с переменной x в данном коде?
Становится равна единице. Совсем тупой что ли?
>Когда объект удаляется? В каждое итерации цикла?
Без оптимизации - да, если с оптимизацией, то компилятор скорее всего вообще уберет x
Если б это был бы настоящий объект с конструктором и деструктором - то да, он каждую бы итерацию создавался и уничтожался.
Ты мог бы сам написать тестовую прогу и выяснить это.
А так, наверное компилятор тупо зарезервирует память под переменную (может даже регистр) на весь цикл, и будет записывать туда единицу каждую итерацию.
Никакого "удаления" не будет. У int нет деструктора. По окончании итерации, эта память попросту объявляется ненужным мусором, поверх которого можно записать всё что угодно.
"Объект" в C++ - это эфемерное понятие. Есть память, все объекты живут где-то в каких-то её местах. У них можно взять адрес (т.е. узнать, где именно в памяти они находятся). Как там распределяется память на стеке под автоматические переменные функции - это интимный вопрос компилятора. Язык C++ это никак не регламентирует.
Создание и удаление объектов - это условность. Сегодня мы считаем, что на этом участке памяти объект существует, а завтра его уже нет.
По правилам C++, создание объектов предваряется конструктором, а удаление завершается деструктором. Но вполне можно сделать трюк, начав считать некий участок памяти уже существующим объектом, без вызова конструктора. И попросту освободить память или переписать её, без вызова деструктора.
Ты просто кастуешь нужный указатель на void к желаемому типу указателя на объект, и обращаешься по этому указателю как ни в чём ни бывало.
В таком простом примере обсуждать оптимизации бессмысленно.
Если это весь код, то переменной вообще может не быть, как и цикла.
Лучше всего тебе ознакомиться с генерируемым ассемблерным кодом. Моя гипотеза в том, что возможно, в stack frame твоей функции, резервируется место под переменную i. Когда исполнение программы доходит до цикла, в эту переменную начинается записываться единица. После окончания цикла - про переменную все попросту напрочь забывают. Деструктора же нет, формальное уничтожение даже не требуется.
Но оптимизатор, ежели не выкинет переменную, может её разместить прямо в регистре процессора. Тем более, никто её адрес не берёт.
Двачую.
Нет, не выносится, для компьютера будет выглядеть как-то так
loop:
новая переменная х
присвоить х 1
если (условие выполняется goto loop)
>Создание и удаление объектов - это условность. Сегодня мы считаем, что на этом участке памяти объект существует, а завтра его уже нет.
Поясню ещё. Вот есть создание объектов на куче, через new. Этот new выделяет участок памяти, размером ровно в твой объект, где он может быть размещён. Затем, если нужно, вызывает конструктор. После этого, считается (условно!), что на этом участке памяти объект существует. На самом же деле, тут никаких грома и молнии с небес не раздаётся, и ничего в компьютере внешне не меняется. Как была та память, так она и остаётся. В конечном итоге ничего может и не случиться - и даже значения байтов памяти на том участке могут остаться прежними.
Единственно что, гарантируется что до удаления объекта через delete, память на этом участке уже не будет повторно выделена кому-либо ещё. Т.е. объекты не будут пересекаться в памяти.
В ассемблерном виде код
for (; ; )
{
int i = 1;
}
Выглядит так
$LN4@main:
movDWORD PTR _i$1[ebp], 1
jmpSHORT $LN4@main
То есть заносим 1 и начинаем цикл заново
Ай мля, забыл, что тут рушится всё, надо было заливать куда-нибудь
https://pastebin.pl/view/97b19318
Это очень туманные объяснения "на пальцах". Что скрывается за "новая переменная x"?
С точки зрения C++, да действительно, в цикле объявлена новая переменная x. Только вот, как это будет выглядеть внутри компьютера, и в ассемблерном коде, генерируемом компилятором?
Где в памяти она будет размещена? И в памяти ли вообще?
Я ж вбросил чуть ниже - сохраняется в стек фрейме, если я правильно понял ассемблер.
Выносится, это же не скриптовая дрисня. Тут компилятор сначала сканирует всю функцию на создание переменных. И условно говоря выносит объявления переменных в начало.
Кстати не исключено что в каком нибудь случае типа
{ int x = 1; ...}
{ int y = 2; ... }
Он может использовать одну и ту же область памяти под обе, ведь их время жизни не пересекается.
Любые тесты подразумевают что при запуске программы запустится не ее main, а main теста. Поэтому в их примере запуск экзешника печатает не факториал, а отчет по тестам.
Судя по докам, все что там требуется задать дефайн и сделать один инклюд.
В принципе это уже твое дело, ты можешь этот дефайн хоть в коде указывать, хоть в cli, хоть в cmake. Главное что main должен остаться либо твой либо их. (Ну или твой тестовый)
В принципе можешь и разделить по файлам, типа один файл с main настоящим, он подключает все остальные твои файлы, а второй файл с main тестовым, он тоже подключает все файлы, а собираешь ты либо тот, либо этот.
Упустил этот момент
Стало понятнее, спасибо, друг!
проверяй на is_open, fstreamы не кидают эксепшены без конфигурации специальной
Я process monitor расчехляю в таких случаях (серьезно, не шучу). Нормального эррор репортинга у фстримов нету просто
Прикольно. А вот что делать человеку, который совсем не программист, но хочет программой попользоваться для работы с файлами, а программа файл не открывает? Как он поймет что не так? Должно же быть решение адекватное. Ок, пусть не адекватное, но хотя бы работающее
пользоваться системным API (CreateFile) и отдавать нормальные ошибки
Он удаляется перед } (закрытие области видимости). Не слушай клоунов-пердоликов на ассемблере.
Лол бля, турбо паскаль наоборот.
Концептуально. Это может быть пустая операция, а может и не. Стандарт ++С данный момент не фиксирует.
Тот анон неправильно выразился. У переменной int x в конце каждой итерации деаллоцируется место хранения (automatic storage в данном случае): https://en.cppreference.com/w/cpp/language/storage_duration
>automatic storage duration. The storage for the object is allocated at the beginning of the enclosing code block and deallocated at the end. All local objects have this storage duration, except those declared static, extern or thread_local.
В результате этого у объекта закончится время жизни: https://en.cppreference.com/w/cpp/language/lifetime
>The lifetime of an object ends when: <...> the storage which the object occupies is released
В результате окончания времени жизни вызывается деструктор: https://en.cppreference.com/w/cpp/language/destructor
>A destructor is a special member function that is called when the lifetime of an object ends
Так как int тривиально разрушим, программа не обязана вызывать деструктор при его уничтожении: https://en.cppreference.com/w/cpp/language/lifetime
>A program is not required to call the destructor of an object to end its lifetime if the object is trivially-destructible or if the program does not rely on the side effects of the destructor.
Как проверять тебе уже ответили - через is_open. А вот как понять почему не открывается я хз, можно ли вообще. С помощью winapi функций вроде можно.
>>835677
https://carbon.now.sh/
Нет, он, на самом деле прав
Двачаю ентого.
1 - создаю пустой C++ проект
2 - пкм - Properties
3 - почему у меня нету настроек C++?
Во всех гайдах и постах он есть, а у меня нет. Что делать?
Насколько я помню в студии разное меню если пкм на солюшне или на проекте.
Правда нужно было файл создать и попробовать собрать проект, без этого этой настройки небыло, спасибо
@
error: сосать, в asio ошибки с концептами, еще какая-то непоправимая хуйня
@
НАХОДИШЬ ИСПРАВЛЯЮЩИЙ КОММИТ ВЫПУЩЕННЫЙ РОВНО ЧЕРЕЗ ДЕНЬ ПОСЛЕ РЕЛИЗА
@
КАЧАЕШЬ МАСТЕР И СОБИРАЕШЬ
@
error: ваша версия gcc говно
@
КАЧАЕШЬ HEAD GCC И ЕБЕШЬСЯ С КОНФИГУРАЦИЕЙ AUTOTOOLS, ПОИСКОМ НУЖНЫХ ЗАВИСИМОСТЕЙ И ИХ ЗАВИСИМОСТЕЙ LIBBISON LIBFLEX LIBHYUSON, БУТСТРАПИШЬ КОМПИЛЯТОР ПО ГАЙДУ ИЗ ИНТЕРНЕТА
@
НЕ ПОФИКСИЛИ
Типичный C++xx в 20xx году. А столько же мучился, чтобы рабочий <filesystem> на винде в 2017 получить.
>использовать что-то кроме Gentoo или Nix для разработки на bleeding edge версиях
А теперь представь, сколько спермоблядям надо пердолиться.
Короче в if я задал несколько условий, но они не выполняются, ни одно. Че я сделал не так, помогите пожалуйста.
Та я такой хуйней по сути и не должен заниматься, так что не так с условиями в иф?
&& -> ||
Согласен.
сейм. я из этой хуйни делал франкенштейна, откатив часть азио на старую реализацию без концептов
Нет конечно.
С чего бы ему? Если что-то есть в сях и это не designated initializer или VLA - то это есть и в плюсах.
Вот у меня QTableModel с контейнером QImage внутри. Когда я меняю один из QImage в модели, он же должен автоматом на QTableView меняться, не?
emit dataChanged, вьюшки сами обновятся
меня поражает логика совкового образования. Для такой хуйни плюсы использовать. Пайтон для этого в разы проще
пояснительную бригаду. Типа всё должно быть определено в пространстве стандартных имён?
Нет, setlocale давно должен умереть. Это интерфейс из ада на уровне си восьмидесятых. А неймспесы ваши нормальная вещь, слизаны из sml.
Ты так заблудился, молодой падаван... У тебя есть ПОТОКИ ввода и вывода. У потоков есть операторы. Должен быть оператор, задающий желаемую кодировку для ПОТОКА. Прочего быть не должно.
1. C++ Crash Course
2. Effective Modern C++
3. C++ Concurrency in Action
4. Game Programming Patterns (эта внешняя)
5. C++ Game Programming
6. SFML Game Development
Вот думаю всё это осилить, параллельно кодать классику на бесплатным арте: тетрис, понг, астероидс и так далее.
Великолепный план? Точный как швейцарские часы?
в деланьи лабах для долбоебов.
Как же вы все заебали с мечтами о фрилансе. Фриланс - это нищая хуевая работа за копейки, тебе скидывают то дерьмо, которое лень засунуть кому либо еще.
Удаленная работа полноценная - это совсем другое, но там набор от сениоров начинается.
Про краш курс нихуя не знаю. Я бы посоветовал страуструпа, но тут его не любят.
У Майерса есть смысл читать вообще все, не только Modern C++ in Action. Я бы даже сказал, что старые книги полезнее, там прям азы и кайф.
Concurrency in action тебе нахуй не надо.
Остальное - пересказ документаций скорее всего.
Почему джунов на удалёнку не берут? Бтв ещё идея - пилить годноту на гитхаб и везде писать свой палпал, будут профиты чи не?
Может где-то и берут, но неохотно. Слишком они нуждаются в помощи и надзоре, чуть что потом заебешься разгребать
Потому-что в мирочке С++ от джуна больше вреда, чем пользы. Если в каком-нить жопаскрипте или питоне худшее, что может быть это эксепшен, который ты поймаешь.
То в С++ ты можешь наворотить такого дерьма, которое будет репродюситься раз в пару тысяч попыток, и отлаживать это можно только анализом краш дампов.
Майерс есть весь, понял, спасибо за совет. А по поводу конкаренси не раскроешь мысль? Чому не? Я даже в жс использую воркеры для того что можно параллелить. Думал в современных плюсах это классика, это знать надо, не? Ну там если захочу свой физический движок написать или какую-то хитрую систему ИИ.
Это тебе потребуется через очень нихуевое количество времени. Я говорю о годах. Пиши в 1 поток и не парься.
Фронтэнд это правильное решение, вкатываться в С++ в 2021 году это надо иметь либо очень большое желание и мотивацию, либо охуенного ментора.
Да ну нахуй. Я с малых лет в компах и электронике в целом, а с недавних пор ещё и в науке. Для меня этим макакингом заниматься - зашквар. Так что буду ловить балдёж на байтоёбстве.
Потоки и кодировки это путь боли. Смотри мою простыню ближе к началу треда.
Гм, первому случайно ответил.
Где связь?
Нормально.
>>836536
Вот это вот наверное нужно всем желающим вкатиться объяснять, мб даже в шапке написать. Устроиться на работу сложнее, чем в других областях. Там, где используют С++ (если мы не про гуи), обычно также нужно знать вузовскую математику, да и сам язык с устоявшейся инфраструктурой а-ля буст, симейк и т. п. Хочется денег - проще сразу реакт учить. Иначе велик шанс заработать синдром самозванца и ушатать нервы.
>Хочется денег - проще сразу реакт учить
За счет этого с С++ приятнее работается, меньше случайных людей, суеты.
Если бы дрочил плюсы прследние гесть лет, то думаю, 100к имел бы(в мск побольше). Изучал бы сейчас предметную область с математикой и рос как инженер.
А пошло все изначально по пизде. Ебаный универ вместо задротства одного языка заставляет каждый пройти на пол шишечки.
По итогу четыре года в жопу. И еще два юнити разрабом, есть то что-то надо.
Все это время смотрел на другие технологии, языки, фреймворки. Так и хз, кого куда. Все какое-то уебанское. Даже норм кроссплатформенного ui нет в 2020 то году. Какое-то приложение запилить, где будет поток данных нон-стоп идти, так все эти виртуальные машины сыпятся из-за сборщиков мусора.
Какие опции есть в 2020? Плюсы довольно универсальны, но работы ноль. Изучать их пять лет, чтобы пойти работать за 50к, и то тебя выебут и высушат на собесах как проститутку конченную.
Дальше пердеть в гейдеве. Ну так опять, там если выйти из снг региона, то более-менее крупные студии со своими велосипедами на плюсах. Да и без этого там предметная область такая, что математика должна быть охуенно выдрочена (шейдера, рендер, геймплей, ии) плюс еще движок, который делают далеко не профессионалы мира программирования.
Либо раз c# косвенно немного познал, то идти в веб. Но там этот веб настолько непостояннен, что хз. Даже если .net брать тат уже за четыре последних лет все изменилось. Завтра наберется критическая масса индусов в майкрософт и они похерят абсолютно все, как и винду. Хотя в .net все вроде збс последнее время. Кроме пожалуй, мобильной разработки.
Также с реактами, хуяктами и иже с ними на js. Какая-то насмешка над миром программирования. Сюр
Что там остается? Java/kotlin. От первого в гугле отказываются на андроиде, второй только благодаря андроиду и живет. Дальше еще никуда не выходил, как я понял. Писать на Java сейчас, когда есть .net, говорят что это такое-себе. Плюс как с андроида уйдет, так никому кроме легаси в банках он не нужен будет.
Про функциональные языки и новые типо go. Ну работы порой больше чем на плюсах, но что там делать, если надо строить карьеру хз.
Резюмируя, не думал что когда буду программистом (хотя бы частично), что такая каша тут происходит. Я, наверное, скоро курить начну. А потом пойду на завод работать аппаратчиком, там до мастера недолго работать. Хоть 100к будет. На ипотеку хватит. А что с программированием делать, куда двигаться дальше?
Сори за простыню
Если бы дрочил плюсы прследние гесть лет, то думаю, 100к имел бы(в мск побольше). Изучал бы сейчас предметную область с математикой и рос как инженер.
А пошло все изначально по пизде. Ебаный универ вместо задротства одного языка заставляет каждый пройти на пол шишечки.
По итогу четыре года в жопу. И еще два юнити разрабом, есть то что-то надо.
Все это время смотрел на другие технологии, языки, фреймворки. Так и хз, кого куда. Все какое-то уебанское. Даже норм кроссплатформенного ui нет в 2020 то году. Какое-то приложение запилить, где будет поток данных нон-стоп идти, так все эти виртуальные машины сыпятся из-за сборщиков мусора.
Какие опции есть в 2020? Плюсы довольно универсальны, но работы ноль. Изучать их пять лет, чтобы пойти работать за 50к, и то тебя выебут и высушат на собесах как проститутку конченную.
Дальше пердеть в гейдеве. Ну так опять, там если выйти из снг региона, то более-менее крупные студии со своими велосипедами на плюсах. Да и без этого там предметная область такая, что математика должна быть охуенно выдрочена (шейдера, рендер, геймплей, ии) плюс еще движок, который делают далеко не профессионалы мира программирования.
Либо раз c# косвенно немного познал, то идти в веб. Но там этот веб настолько непостояннен, что хз. Даже если .net брать тат уже за четыре последних лет все изменилось. Завтра наберется критическая масса индусов в майкрософт и они похерят абсолютно все, как и винду. Хотя в .net все вроде збс последнее время. Кроме пожалуй, мобильной разработки.
Также с реактами, хуяктами и иже с ними на js. Какая-то насмешка над миром программирования. Сюр
Что там остается? Java/kotlin. От первого в гугле отказываются на андроиде, второй только благодаря андроиду и живет. Дальше еще никуда не выходил, как я понял. Писать на Java сейчас, когда есть .net, говорят что это такое-себе. Плюс как с андроида уйдет, так никому кроме легаси в банках он не нужен будет.
Про функциональные языки и новые типо go. Ну работы порой больше чем на плюсах, но что там делать, если надо строить карьеру хз.
Резюмируя, не думал что когда буду программистом (хотя бы частично), что такая каша тут происходит. Я, наверное, скоро курить начну. А потом пойду на завод работать аппаратчиком, там до мастера недолго работать. Хоть 100к будет. На ипотеку хватит. А что с программированием делать, куда двигаться дальше?
Сори за простыню
Как же я тебя понимаю
мимо походу через недельку приму оффер в рога и копыта (но зато наконец на плюсах), потому что для других мест я до сих пор мало знаю, а от всего другого тошнит
template<class T, size_t N>
class CustomArray;
выдаёт undefined reference, если явно не написать
template CustomArray<int,1>;
Т.е шаблонные сущности приходится писавть в заголовке, в ущерб читаемости?
Добро пожаловать в С++
Походу лох.
Вообще хз на кой читать книги на 1к страниц если всё доступно и просто расписано в 100+ статьях.
Че делать.
Объясни, как ты собираешься маскировать переполняющийся текст за границами поля? Я охуел, SFML слишком игрушечный фреймворк.
У меня были идеи с GL_STENCIL_BUFFER и GL_SCISSORS, но это дохуя вмешательств в OpenGL и в кишки sfml, так что предстоит веселье.
Пиши сразу нормально.
да.
Все бы было легко. Если бы не ебучая капча. Она по определению работает только в браузерах. Меня бы даже устроило если бы она всегда показывала картиночки, а я на них кликал (она все равно мне всегда показывает после десятка сообщений). Но такой вариант видимо был бы слишком легким. Поэтому в гугле написали виртуальную машину на JS, которая там чет шифрует как денува, меняет свои опкоды, загружает говно с серверов.
Поэтому вопрос - какой есть самый минимальный встраиваемый браузер? Очевидно нужен html + css + js. Блджад, ну не CEF же тащить только ради капчи. Webkit предлагает на винде через Edge. Так это тот же хром будет в памяти висеть. Ну не писец ли? Нет чего помельче? Хотя подозреваю, что если соберу просто из какой нибудь либы рендера и либы жса, гугл меня просто нахуй пошлет за нестандартность.
Это потому, что долбоёбов на планете много. На пустом месте геморрой с инклюдом якобы имплементации, геморрой с переключением между файлами, геморрой с навигацией по символам и т.д.
Если уж совсем невмоготу, можно в конец файла реализацию выносить.
Этот курс на английском есть в шапке, можно как-то поместить его в неё?
Тупые бабы, пиздос.
Не использую vcpkg, так как с ним геморно держать несколько версий либы. Например, есть 50 проектов, 20 солюшенов, состоящих из некоторого сочетания проектов, и у каждого солюшена - где то 5 вариантов checkout по версиям, не считая 100500 тегов. И собирается это не только у каждого разраба, но и на едином билд сервере. Vcpkg тут похоже бессилен, только ручные props, только хардкор.
Призови в тред нвидию-куна, у них там натянули версионность на vcpkg.
Алсо, у MS вроде в дорожной карте по vcpkg есть пункт по поводу поддержки версионности.
Интересно, надо почитать. Было бы круто вместе с публичным либами и свои так опакечивать (с префиксом например). А то иногда случаются версионные казусы, когда две своих либы используют третью, разных версий
Как хрена у майкрософта в delete указано const?
У меня из-за этого по виндой пару аллокация-деаллокация распидорасило, потому что мой delete не вызывался.
Что за шутки такие?
Причём нигде это не указано, он должен быть void⚹, а не void⚹ const.
Микрософт в этом месяце обещали выкатить версионирование (но хз, успеют ли уже, я бдю их репо)
сельди не умеют даже в транслит
Нахуя в принципе параметры функции нессылочных типов объявлять константными? Они ж и так, блять, копируются.
Свои либы можно подружить с vcpkg 100%, у них в документации есть гайд
Этот const ни на что не влияет, у тебя проблема в друго месте. А нужен он затем, чтобы внутри функции нельзя было случайно изменить тот указатель, что тебе пришёл
Я ебу? Ты хуйни кинул милипиздрической по которой нихуяшеньки не понятно ничего и что-то хочешь, ты либо всё высри уж, будь добр, либо сам дальше ебись с этим и не сри в тред.
Подскажите книги или статьи по которым можно. Да мог бы сам загуглить (и гуглил уже), но во всех гайдах замечаю резкие рывки между материалами из-за которых остается много вопросов (например прикрутим какую-то либу и в слепую используем её методы без разъяснений).
Писать как человек.
После твоего поста я присмотрелся — действительно не может влиять никак, лол.
Но влияет, лол. msvc перестаёт воспринимать мой оверлоад как валидный.
Всё, отмена.
launch: program ' does not exist
уже несколько часов долблю себе голову как его запустить
>как его запустить
Поставить студию
А вообще ты даже не гуглил, да?
https://stackoverflow.com/questions/47872250/cant-compile-code-launch-program-program-path-does-not-exist
Благодарствую
Нормально там всё.
и правда, в шары ебусь
Не надо ломать никакие головы, надо просто настроить все по оф инструкции.
if ((m != 0) && (m < (1u << (sizeof(n))))) {
return(ERROR_SUCCESS);
}
Я узнал тебя.
Это потому что его нет. Но смотреть надо не в ту сторону:
> if (i & (1 << j)))
i здесь скорее всего индекс, значит потенциально size_t, потенциально uint64_t.
А что происходит, когда мы делаем левый сдвиг 32 битной переменной с последующим расширением до 64 бит?
>скорее всего
Или нет.
По этому куску кода нечего диагностировать.
Это как рак ставить через интернет.
https://pastebin.com/raw/ayciFuq6 (там это ещё внутри класса происходит)
Но v почему-то остаётся нулевым после конструктора. Почему оно не срабатывает как задумывалось?
Алсо, кажется предпреждения при присваивании (внутри лямбды) не было
Поэтому не обратил внимания
правильное имя локали пропиши
захвата по указателю не существует. Ты скопировал нулевой указатель и потом что-то с ним сделал.
Происходит левый сдвиг с последующим рашширением. Ваш капитан.
for()
{
}
от просто for()
или if()
{
}
от просто if
Почему некоторые выражения после объявления оператора оборачиваются в блок, а некоторые нет?
Без фигурных скобок только следующая команда попадет под оператор if или for
Можно ли из exe-шника, скомпилированного из С++, получить исходный код, желательно со всеми именами переменных?
Хуй там, если только кто-то не забыл отключить debug.
Попробуй snowman, но скорее всего получится нечитаемое говно.
> Объясни, как ты собираешься маскировать переполняющийся текст за границами поля?
Что ты имеешь ввиду? Типа если в textbox какой-нибудь записали строку которая превышает визуально максимальную длину? Тогда тебе надо просто рендерить фрагмент строки который визуально влезет в поле.
Если про поле со скроллингом, то надо писать расчёт переноса строки учитывая размер шрифта, внутренний отступ и размер виджета.
Алсо, у sfml есть класс View, он может послужить заменой gl_scissors
Что это за параметр? Константный указатель на константный объект?
спасибо
нет, нельзя. Максимум - можно сишное говно получить адовое через HexRays. Иногда это даже полезно.
Это в начале кода
#define __CRTDBG_MAP_ALLOC
#include <crtdbg.h>
#define DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__)
#define new DEBUG_NEW
И это перед return 0
_CrtDumpMemoryLeaks();
Гугли по слову Профайлер\Профилировщик
Какой же пиздец. Вместо написания кода утро началось с ебли со студией. Ебучая мокрописька от джетмозга после апдейта отказывается видеть stdint.h, вот просто не видит именно этот инклюд и серит ошибками на инты, уже как только его не прописывал.
А ещё эта поддержка симэйка в Студии, просто топ - половина плагинов отказываются с ним работать и просят солюшен, хоть одна пердоля обновила бы свой плагин за 2 года.
CLion в принципе говно с тирингом и автокомплитом для пердолей, не хочу даже шкварится. Ещё и clang не работает нормально, джетмозг же.
Хоть на голую студию садись - фич мало, но зато работает нормально.
> отказывается видеть stdint.h
Почисти кеш
> симэйк
Пока что проигрывает солюшену практически во всём
> Почисти кеш
Естественно погугли сам. Чистил кеш в настройках, чистил руками в папках, жал suspend, прожимал все возможные переиндексации проекта - нихуя не помогло. Собирается естественно без проблем.
Смени версию студии, операционную систему, железо, страну проживания и пол.
Попробуй заинклюдить cstdlib/cstddef. А лучше переустанови шиндовс.
Ох уж эти спермопроблемы.
Но ведь без решарпера всё норм. Это пердоли со своей джавой объебались и пишут говнокод.
Под винду concurrency::parallel_for_each() работает потрясающе, под android ppl.h не существует, и единственный способ организовать параллельный for, который я нашел - это openpm. И как бы я не изгалялся, openmp дает внушительную просадку по производительности. Сравнивая скорости, обычный последовательный for работает медленее, чем виндовый, но намного быстрее, чем openpm.
Может, я что-то упускаю с openpm? Я допускаю случай, что на каждой итерации у меня настолько быстрые вычисления, что спавн новых потоков дает только перерасход по времени. Но виндовая параллельность как-то же с этим справляется.
Есть ли еще какой-то способ организовать параллельный for на андроиде?
То есть всякие исходники игр нереально получить, только нечитаемый билд? Или как?
Можешь взять выложенные в опенсорс, квейк там и тп.
А бля, забейте, я понял
Бамп годному вопросу.
современный с++ - это эзотерический язык, изучается с целью получения удовольствия как хобби
ни о какой работе за деньги речь не идет, тебя наебали если планируешь иначе
даже нвидиа-кун с зп 300кк в секунду занимается на работе всем, кроме собственно написания кода на с++, хотя по должности типа погроммист с++
вот так вот
>Высрать какой-нибудь годный пет в попенсор
Вощем высри 64 бит avisynth vfw кодек который может avi stubs где внутри вшит avisynth скрипт чтобы такой avi файл можно было открыть в adobe after effects
Толсто.
>даже нвидиа-кун с зп 300кк в секунду занимается на работе всем, кроме собственно написания кода на с++, хотя по должности типа погроммист с++
Мне недавно дали немного пописать на сиплюсплюсе кстати! Но у меня должность такая ебанутая, т.к. у нас все могут писать на С++, а вещами которыми занимаюсь я - могу заниматься только я.
ну и продолжая - мы недавно обсуждали, что вообще все наши компоненты (кроме драйвера офк) можно переписать на Сишарпе. Было бы сильно проще с точки зрения мейнтейнабили и скорости разработки, но увы. Быть может, когда-нибудь перепишем.
Использовать С++17
template< class ExecutionPolicy, class ForwardIt, class UnaryFunction2 >
void for_each( ExecutionPolicy&& policy, ForwardIt first, ForwardIt last, UnaryFunction2 f );
В надежде, что при std::parallel_policy в твоей STL оно работает через какой нибудь пул потоков / concurrency рантайм и т.д.
при всем увожении, это оправдание!
не работаю щас погроммистом
но в качестве развлечения смотрю как меняется с++, те как те вещи которые делались в книжке александреску можно сейчас делать на крестах, стало удобней но скучней
то же самое с stl: как изменили язык чтобы делать библиотеки типа stl симпатичней с точки зрения синтаксиса
А куда укатился и почему?
Кстати да, иногда заглядывал в потроха kernel32 и ntdll? лбопытно как некоторые вещи работают именно в винде а не в Wine. Теперь можно попробовать утёкшие сорцы скачать
> вообще все наши компоненты (кроме драйвера офк) можно переписать на Сишарпе
Но нужно кучу времени и добавится слой абстракции над байтоеблей и IOCTL
Да хоть ты лопни, да хоть тресни - бамп на ровном месте.
пожалуй я неверно выразился, само собой, юзермод компонент драйвера тоже на крестах, там перф нужен. А более он нигде не нужен у нас в стэке.
>то же самое с stl: как изменили язык чтобы делать библиотеки типа stl симпатичней с точки зрения синтаксиса
Очень интересно это всё (stl, qt, com) может поменяться когда сделают метаклассы, и вместо пространных описаний-соглашений (типа что такое итератор, аллокатор, com-интерфейс, coclass, сигнал-слот, Q_OBJECT) будет код. Тогда и часть MOC можно будет выкинуть - смотри https://wg21.link/p0707
Забыл написать, что ExecutionPolicy не реализован под Android, да.
Ошибка уже на этапе #include <execution>.
А разве метаклассы это не просто синтаксический сахар для хитровыебанных конструкций SFINAE и static_assert ?
Нее, там всё интереснее. Лучше сам почитай, чем я криво пересказывать буду.
Скажем так, это не только сахар вместо SFINAE и static assert (тут будет скорее концепты), но и кодогенерация, только не макросами а по-нормальному.
ты глянь выступление джосаттиса на одном из cppcon, он понятно и со многими примерами показывает когда метаклассы были бы полезны
Вот к такому constexpr прилепить или ещё что. Пытался куда-нибудь меж скобок присунуть, но не лезет.
[]() -> auto⚹ {auto a = 1; return &a; }()
А в чём проблема положить указатель сразу за интом в кучу, указывающий на -8 байт назад? Я могу заранее определить куда надо указывать, а компилятор не может?
>Я допускаю случай, что на каждой итерации у меня настолько быстрые вычисления, что спавн новых потоков дает только перерасход по времени. Но виндовая параллельность как-то же с этим справляется.
>Забыл написать, что ExecutionPolicy не реализован под Android, да.
Тогда печаль. OpenMP как раз может быть сделан через создание новых потоков, и тогда всё грустно - это дорогая операция. Виндовая параллельность работает либо через свой пул потоков, либо через виндовский CreateThreadpool - начиная с висты. И вообще их много - Concurrency, AMP, PPL, OpenMP (в студии не свежий 2.0 и частично запилены SIMD extensions. Народ хочет 4.0+), STL Extensions for parallelism (тут надо смотреть как реализованы. причем в разных версиях винды может быть разный бекенд)
И вообще, нужно тщательно проверять - не упрешься ли ты в доступ к памяти, если делать параллельным в лоб. Посотри https://devblogs.microsoft.com/cppblog/using-c17-parallel-algorithms-for-better-performance/ - часть от параллелизма у них ухудшилась, и решили не параллелить.
Нет никакой проблемы, но константа тогда тоже должна быть constexpr, но это не точно
Хотя хуй с ним, компилятор эту лапшу оптимизирует до двух инструкций, оно и так заебись.
>Пытался куда-нибудь меж скобок присунуть, но не лезет.
Смотри же спецификацию
>[ captures ] <tparams>(optional) (C++20) ( params ) specifiers exception attr -> ret requires(optional) (C++20) { body }
Куда specifiers, туда и constexpr:
https://godbolt.org/z/z6e6on
Это потому что лямбды по умолчанию constexpr
через persistent editor задаешь виджет, у виджета перегружаешь метод paintEvent, рисуешь че хочешь, епта
Сам делает
Запускаю на Oculus Quest, там два проца по 4 ядра.
Так может и мне у себя организовать пул потоков? Чтобы крутились весь рантайм и проверяли, не появились ли новые данные у них для обработки. Или только хуже сделаю?
>Забей хуй. Прога это не твое
Но я всегда мечтал вкатится в с++ и писать проги, есть желание, вроде мозги тоже есть, но многие вещи в голове не укладываются(
Я всё ещё тут. Сейчас планирую заспидранить в opengl + qt. Какие подводные?
Что у тебя в голове не укладывается? Простые языковые конструкции? Это еще даже не ЯП, а что-то общее. Как ты речь человеческую понимаешь вообще, у меня вопрос?
>почему блять в мейне вводится cin и блять в while вводится Син, какого хуя
Велкам ту Си++, инжой ёр implicit conversions. Там суть в том, что cin можно неявно привести к типу bool, и внутри while именно это и делается. Если оператор приведения вернул false - входной поток закончился (или что-то пошло не так), если true - ещё можно оттуда читать. Вот документация: https://en.cppreference.com/w/cpp/io/basic_ios/operator_bool Если честно, cin и cout в принципе хреново спроектированы, лучше используй сишные функции fopen/fread/fwrite или какой-нибудь fmtlib.
>Велкам ту Си++, инжой ёр implicit conversions. Там суть в том, что cin можно неявно привести к типу bool, и внутри while именно это и делается. Если оператор приведения вернул false - входной поток закончился (или что-то пошло не так), если true - ещё можно оттуда читать. Вот документация: https://en.cppreference.com/w/cpp/io/basic_ios/operator_bool Если честно, cin и cout в принципе хреново спроектированы, лучше используй сишные функции fopen/fread/fwrite или какой-нибудь fmtlib.
Добра тебе! Теперь понял
>Что у тебя в голове не укладывается? Простые языковые конструкции? Это еще даже не ЯП, а что-то общее. Как ты речь человеческую понимаешь вообще, у меня вопрос?
Сейчас бы сравнивать машинный язык и человеческий))) в жизни тоже через 101010101 отвечаешь ?
Челик не в курсе что ЯП это и есть человеческий язык, только строго ограниченный компилятором
Что тебе конкретно не понятно допустим вот в этой конструкции:
Пока (есть моча)
{ ссать }
Нет, в принципе стримы нормальная идея, но не конкретно iostream. Ну кто догадался иметь глобальный стэйт в стримах, кто догадался совместить флаш и новую строку, кто догадался сделать такое хреновое апи для получения ошибок?
>Челик не в курсе что ЯП это и есть человеческий язык, только строго ограниченный компилятором
>Что тебе конкретно не понятно допустим вот в этой конструкции:
>Пока (есть моча)
>{ ссать }
Как ты думаешь?
Я Кун 25лвл получивший вышку по геологии и работаю сраным менеджером за 50к, сейчас осознал что мне нравится заниматься коддингом и начал его самостоятельно изучать
, собственно изучаю базовые понятия и как они работают, вопросов много и они для вас как сходить посрать, а для меня как целая вселенная
Тогда ты уже дважды обосрался. Первый что вообще начал изучать сраные, сцаные, обосранные уебищные блевотные вонючие кресты
>А как ты понял что тебе нравится заниматься кодингом не кодируя?
Когда впервые смог написать код для обычного калькулятора
Что не так? Сейчас на крестах поймет как работает память, указатели, стек и всю хуйню, после чего вкат в любой другой новомодный язык будет занимать неделю.
>Тогда ты уже дважды обосрался. Первый что вообще начал изучать сраные, сцаные, обосранные уебищные блевотные вонючие кресты
Я прос
>>840767
>Когда впервые смог написать код для обычного калькулятора
Сейчас просто решаю задачи на stepik.org параллельно изучаю теорию, более менее знания накапливаются, желание и упорство заниматься этим у меня есть
Че
Ты его вопросы видел? У него на вкат пару лет уйдет. Нет ну есть, конечно, разные подходы к изучению проги, но советовать челу 25+ лет начать вкатываться с изучения крестов, ну это я не знаю. Зачем так жестоко шутить кароче?
>Ты его вопросы видел? У него на вкат пару лет уйдет. Нет ну есть, конечно, разные подходы к изучению проги, но советовать челу 25+ лет начать вкатываться с изучения крестов, ну это я не знаю. Зачем так жестоко шутить кароче?
Даже пусть пару лет, я вообще под это дело планирую 5 лет потратить
Ха, нормально. Ну мне даже интересен стал твой бизнес план. Потратишь ты в общем лет 5, дальше че?
>Ха, нормально. Ну мне даже интересен стал твой бизнес план. Потратишь ты в общем лет 5, дальше че?
А что должно быть дальше? Если мне нравится, то можно назвать это дело как хобби, возможно стану писать проги на заказ или вкачусь в айти компанию на работу.
Ясно, манямир кароче. Напишешь сюда через пять лет чего добился
Прорвало-то как тебя, а
Как я понял из википедии, в UTF-8 для разных символов разная длина в байтах. Так, например, для английских букв - 1 байт, а для русских - 2. Но тогда возникает вопрос, каким образом обрабатывать такую строку, ведь пробел так же занимает один байт?
Это... сложно. Если передать всю строку, то в линкусе будет работать как есть. Если же тебе нужно передать один символ, то придётся парсить входной поток и разделять его на code point'ы. Хорошее упражнение, кстати, там ведь довольно простая кодировка. В тяжёлых случаях используют какую-нибудь библиотеку для работы с юникодом, например ICU. В UTF-8 ещё есть одна полезная хакафича: если тебе важно только сравнение с определённым символов ASCII, например, пробелом, то тебе просто достаточно каждый char сравнивать с 0x20 (' ').
>>840880
Нет. Если настроишь локаль на условный CP1251, где русские символы однобайтовые, то входная строка тоже должна быть в CP1251. А вроде как во всех компиляторах по умолчанию строка вида "Привет, мир" будет кодироваться в UTF-8.
Ну если fmtlib под рукой нет, то я возьму printf/sprintf/fprintf, а не iostream.
Ну а если мне этот sprintf нужен в трёх местах на несколько тысяч строк, зачем целую либу для этого?
У тебя есть выбор: нативные ос вызовы, fread/fwrite или iostream. Что бы ты выбрал?
>во всех компиляторах по умолчанию строка вида "Привет, мир" будет кодироваться в UTF-8
В той же кодировке что исходный файл не? Плюс всегда есть -finput-charset=...
>В той же кодировке что исходный файл не
Честно, не помню. Возможно и так.
>Плюс всегда есть -finput-charset=...
Тяжёлая артиллерия пошла в бой.
По моему мнению лучше уж тогда явно префиксы прописывать (u8, u, U).
Следующий код:
void Foo()
{
Shader shader(filename);
}
работает безошибочно в 100% случаев, тогда как
void Foo()
{
auto shader = new Shader(filename);
delete shader;
}
Вылетает с double free or corruption в 100% случаев
Как это можно объяснить?
Ошибка где-то ещё.
В первом случае взяли из массив сначала первый байт, потом второй байт, положили эти два байта рядом друг с другом и прибавили к результату. Первый байт при этом старший. Второй — младший.
Во втором случае взяли указатель на первый байт, преборазовали его в указатель на unsigned short, исходя из предположения, что он представляет собой два байта, а затем разыменовали указатель, присвоив полученные два байта переменной word.
Какой байт при этом окажется старшим, а какой младшим — зависиит от платформы.
На распространённой little-endian первый байт окажется младшим, а второй — старшим.
Тоак что да, результат может отличаться.
А если по условию надо ключи преобразовывать в числа для хеширования через "сложение двухбайтовых слов"? Что правильнее?
>Что правильнее?
Без разницы.
Вся криптография во всём мире строится на том, что один раз кто-то делает reference-implementation, а все остальные, кто хочет соответствовать какому-то стандарту, делают так, "как у них".
Грубо говоря, нужно делать так, чтоб результат сходился.
Иногда для этого не приходится делать дополнительных действий, а иногда приходится разворачивать байты.
У тебя есть контрольный пример?
Контрольный пример? Ты про список ключей для хеширования? Есть. Но с тем и с другим способом перевода ключа в число результат сильно отличается.
Я про документацию, в которой есть пример исходных данных и пример того, какой результат должен получиться.
Нет. Сказано только сделать заебись.
Открой в годболте и посмотри. Там скорее всего одно и то же будет.
>>841271
С чего бы, блядь? От какого-то такого "твоего имени"? Ты где находишься?
Ты выложил кусок кода, кто-то спросил, а не похож ли второй скрин на UB. Спросил в треде. Не у тебя в личке.
Я посмотрел внимательно и одобрительно кивнул — да, действительно: UB (исходя из предположения, что key — [unsigned] char array).
Я понял. Ты ответил на вопрос, что на второй картинке. Ладно, не семён. Я просто не разбираюсь в этой вашей проградристовской терминологии.
Это американцы неграмотные ou не пишут, от них это пошло. У них свой англюсек. И статьи на английском если без ou, где оно должно быть, это детектор безграмотного автора пиндоса.
Пидарасы со своим armor, color, уххх, поубивал бы.
Не может. В UTF-8 нет "перекрытия" между ASCII и не-ASCII. Большая "P" (U+0420) кодируется как 0xD0 0xA0.
На первой: переполнит инт 16 бит.
От?
Вот это да. Получается, что в C++ в 2020 году до сих пор нереализована поддержка UTF-8? А ещё высокоуровневый язык называется. В Java такой проблемы, кстати, вообще нет.
>как можно настроить этот проклятый vs code для без геморрной работы
Удалить и поставить обычный vs, не code
Но есть нюансы.
По инструкции. Хз, для простых примеров вообще хватает плагина code runner, и прописанного ручками пути к компилятоу.
Обычная вижуал студия - лучше ничего нету
Если ты контуженный даун-пердоля, у которого цель поебаться с консолькой - то да.
Если ты вменяемый человек, который хочет выучить С++ - то это противопоказано
gcc main.cpp очень пердольно.
В вижуал студио можно научиться разве что ебаться с Виндой и рисовать окошки не понимая процесса компиляции
Во-первых, либо gcc main.c, либо g++ main.cpp.
Во-вторых, тот анон прав. Лучше всего Code::Blocks или Dev-C++ на Windows 7 с кодировкой Windows-1251. Потому что ни Си, ни C++ в любом случае UTF-8 нормально не поддерживают и на Линуксе ты будешь страдать.
В разы пердольнее, чем 1 кнопочка c зеленым треугольничком.
А когда у тебя 2+ файла - еще пердольнее. И еще, и еще. А компиляцию рано или поздно все равно поймешь, не надо для этого ебаться с консолькой.
Что кокблокс, что девС++ мертвая некропараша. Либо вижуал студия, ну либо шлион уж. Все, третьего не дано (ну окей, культикриэйтор еще, но он без кутей оно не нужно)
>Что кокблокс, что девС++ мертвая некропараша.
Что значит "мертвая"? Байты в исходном коде испортились?
>Либо вижуал студия
А, ясно, это троллинг.
Он у меня установлен вообще-то, даун.
>Что значит "мертвая"
Пикрелейтед
> А, ясно, это троллинг.
В чем троллинг? Вижуал студия это топ1 IDE в данный момент, очень дружелюбна к новичкам, дохуя всего дает профессионалам. В ней пишут дохуя профи, в консоли и прочих CODE BLOCKS пердолятся только студентики и сектанты.
Пердолюсь в вижуалстудии за 9 килобаксов в месяц на руки. Тоже могу ответов подсказать.
>пик1
Ну и что, оно же работает.
>пик2
Последний апдейт в этом году. Или тебе нужно, чтобы новая версия выходила каждую неделю, чтобы там обязательно что-нибудь ломали и из-за этого у тебя всё не работало?
>В чем троллинг?
Ну она же весит 50+ гигов, запускается несколько минут и вообще максимально перегруженная, тяжеловесная, неповоротливая и неудобная.
> Ну она же весит 50+ гигов, запускается несколько минут и вообще максимально перегруженная, тяжеловесная, неповоротливая и неудобная.
Вот и спалили студентика с ноутбуком для учебы 2 ядра 2 гига. На моей машине она стартует несколько секунд, а ССД на 2 терабайта абсолютно похуй, сколько там гигабайт (и да, оно весит 8, а не 50).
Как там с анальными зондами и загрузкой идеи по паре минут? ))))
Если не пиздишь - то кросс, что пишешь?
>без фичей С++14\С++17\С++20. Без статического анализа, без рефакторинга.
А ты часто этим пользуешься?
Зачем ты число принтуешь? Тебе надо строку.
Понапридумывают своих cout и...
Я до сих пор на printf сижу, недавно только научился new и delete использовать вместо malloc/calloc и free.
2076x1246, 0:13
Ебанулся? У нас весь прод на С++17, с кучей всяких structured bindings, иф констэкспров и прочих клевых вещей. Статический анализатор в виде решарпера (и clang-tidy) используется всеми в команде. Мы же прод пишем, а не лабы.
>>841498
Держи открытие Анреал Энжина 4 в вижуал студии на компьютере, а не на ноутбуке для учебы.
~10 лет
>Во-первых, либо gcc main.c, либо g++ main.cpp.
Необязательно
>на Линуксе ты будешь страдать.
Толсто
Так платят ровно 2 конторы в Москве. И одна из них сбербанк. Вторую угадаешь сам.
>Необязательно
Да, но так правильней. C и C++ это не одно и то же.
>Толсто
Всмысле? На винде просто прописываешь setlocale(LC_ALL, "Russian"); и работаешь с русскими буквами как с элементами массива. А на Линуксе... Ну, ты просто взгляни на пердолинг выше.
Заинтересовала работа, а не зарплата.
В сбере хз кому столько платят, разрабам платят 100-200к.
>C и C++ это не одно и то же.
Безусловно
Но gcc компилирует в зависимости от расширения файла, а gcc/g++ влияют на используемые флаги (и некоторые нюансы) — на линковку stdlib и прочее.
Жесть
Допустим что?
Какого типа элементы массива на Винде, если вмещают кириллицу? А кану они в то же время вмещают? Если нет, там кодовые страницы а ля Дос?
>Какого типа элементы массива на Винде, если вмещают кириллицу? А кану они в то же время вмещают? Если нет, там кодовые страницы а ля Дос?
Зачем нам эта информация? Мы на ассемблере будем программировать или на языке высокого уровня? Факт в том, что в Windows индексация по массиву из кириллицы просто работает, а на Линуксе - нет.
Очевидно. Но ты просто представь, на сколько это затрудняет и усложняет обработку строки. В той же Java этой проблемы с юникодом нет, и меня действительно удивляет, почему в C++ в 2020 настолько базовая вещь до сих пор не реализована.
ЕМНИП в джаве UTF-16, и даже там ты очень сильно огребёшь, когда наткнёшься на суррогатные пары.
В байтах.
Если я не ошибаюсь, это только входная/выходная кодировка при конвертации по умолчанию. При работе с чистыми String там внутри UTF-16, и размер char 2 байта.
Может быть и так, но итерироваться по utf-8 символам, и даже сравнивать их в Java мне это никогда не мешало.
Потому что кодировка строго определена. Поэтому итерация по символам. В строке в плюсах элемент строки - не символ.
И снова я тебе говорю, если тебе попадётся суррогатная пара, то одна из итераций у тебя будет на пол-символа. Да, все символы для которых они нужны находятся за пределами Basic Multilingual Plane, но они, блин, существуют, и все эмодзи и прочие там. То, что ты итерировался, лишь означает, что тебе просто повезло с входным текстом.
Ладно, придётся обратно на винду перекатываться чтобы однобайтные кодировки без проблем использовать. UTF-8 был ошибкой.
>однобайтные кодировки
Даже не думай, я в своё время настрадался с кодовых страниц. Мир не ограничивается 256 символами, EBCDIC и остальные должны были остаться в семидесятых, где им и место.
В ICU есть итераторы для этого: https://stackoverflow.com/questions/26446819/icu-iterate-codepoints
Проблема в том, что UnicodeString это уже не просто String, и взаимодействовать с ней как с обычной String, использовать функции для String уже не получится. Ну и зачем тогда это?
Да.
вот есть классы систем, они как бы главные. Например система EventManager которая узнает что были события, и передает об этом факте подписчикам. Или система ConfigManager которая хранит текущие глобальные конфиги. Или LogSystem который маневрирует логами. Ну и в таком духе. Систем десятки.
Как организовать между ними связи по красивому?
Синглтон не хочу (вдруг мне понадобится разные ConfigManager в зависимости от условий?).. Завязывать прям все на синглтоны не красиво. Завязывать только пару систем - задают вопросы, почему вот тут синглтон, а вот тут указателем передал.
Передавать между ними указатели не хочу - не люблю когда в методы (или конструктор) передается дохрена всякого.
А еще хочу чтобы каждая система не знала ничего о других кроме тех, которые ей могут понадобится...
Может подкинешь идей?
>не люблю когда в методы (или конструктор) передается дохрена всякого.
Ну сделай класс контекст, в котором ссылки на текущие системы, и только его передавай. Класс будет реализовывать интерфейсы получения этих систем, и другие системы будут дергать только нужные доступные им интерфейсы а не целиком контекст.
Код который работает:
#include <iostream>
#include <locale.h>
#include <stdio.h>
int main()
{
setlocale(LC_ALL, "Russian");
int A,B,C;
printf("Введiть перший операнд:\n");
scanf("%d", &A);
printf("Введiть другий операнд:\n");
scanf("%d", &B);
C=A+B;
for(unsigned q=1U<<3; q; q>>=1)
putchar('0'+!!(A&q));// вывод первого операнда
putchar('\n');
putchar('0'+!!(B&q)); //вывод второго операнда
putchar('\n');
putchar('0'+!!(C&q)); //вывод результата сложения
}
Код который работает:
#include <iostream>
#include <locale.h>
#include <stdio.h>
int main()
{
setlocale(LC_ALL, "Russian");
int A,B,C;
printf("Введiть перший операнд:\n");
scanf("%d", &A);
printf("Введiть другий операнд:\n");
scanf("%d", &B);
C=A+B;
for(unsigned q=1U<<3; q; q>>=1)
putchar('0'+!!(A&q));// вывод первого операнда
putchar('\n');
putchar('0'+!!(B&q)); //вывод второго операнда
putchar('\n');
putchar('0'+!!(C&q)); //вывод результата сложения
}
>UnicodeString это уже не просто String, и взаимодействовать с ней как с обычной String, использовать функции для String уже не получится
Внезапно, в C++ почти все алгоритмы построены на итераторах. Тебе вообще не важно, как устроен контейнер, если он предоставляет интерфейс к ним. Степанов всё-таки не зря старался, когда STL писал.
Pubsub
Js тред чуть ниже.
>Передавать между ними указатели не хочу - не люблю когда в методы (или конструктор) передается дохрена всякого.
Во всех компаниях, где я был (целых трёх, две из них большие), сначала использовали самописные сервис локаторы, но потом все всё равно переходили на обычную инъекцию зависимостей через передачу сервисов в конструкторы. Логгеры, настройки, всякие сервисы, даже время - всё явно.
Сервера. Микроконтроллеры.
Под линуксом работают только маргиналы. Посмотри на любую конференцию - у всех либо маки, либо синкпады. Пердоликов с линуксом - статистическая погрешность.
На корпоративные ноутбуки часто нельзя ставить ничего, кроме той винды, которая там есть. У нас, например, нельзя.
Представь, приходишь такой к тимлиду, он тебе протягивает руку пожать, а ты ему средний палец на ноге тянешь.
Я бы на его месте тебе тоже сегментацию зафаултил.
Проиграл
Что запрещает?
Корпоративная политика с битлокером и всякой конторской телеметрией.
Кто-нибудь делал интерфейс где чуть больше чем два окошечка? Как всё это организовать вместе?
Вложенные узлы имеют column соответствующий уровню вложенности. ListView скорее всего читает только первый столбец.
Ничего. Я сделал сабкласс от QStandrItem, данные храню в них (пары значений имя - индексы sql-евской БД), ну и по QIcon в каждом объекте.
>А хотя может и один столбец...
Один, посмотрел по дебагеру. Там скорее всего просто parent хранит ссылки на childов как в дереве.
>ListView скорее всего читает только первый столбец.
Известно, каким методом читает? Его можно переопределеить?
хорошо, так boost::asio это уже все готовое, а как вот самому поебаться с select, poll и т.д.
beej guide to network programming
Передавать переменные по ссылке не пробовал?
Обалдеть, анончики, прислали оффер!
Функции нужны для того, что принимает одно и выдаёт другое.
Если у тебя участок кода работает с локальными переменными, то оформи его в макрос. Такое может быть полезно, например, при генерации меша куба или каких-нибудь проверок (рейтрейсинг) того же куба. У него 6 и код почти одинаков.
Например такой псевдокод:
enum class Usage { Read, Write, ReadWrite };
using BufferRead = Buffer( Usage::Read, 1024 );
using BufferWrite = Buffer( Usage::Write, 1024 );
using BufferReadWrite = Buffer( Usage::ReadWrite, 1024 );
qbittorrent
нет
> проблемы с лицензией
Не ебет. Я же для себя.
Вот есть у меня программка небольшая. Просто график по физике строит. Нужно скинуть преподу. Я ему блять должен скидывать еще 5 dll, папку platforms на 100 мб?
Да
Ну потому что шин10
Вроде как этот защитник можно было под шконку загнать. Но антивирусом пройтись стоит.
В опенгл есть буферы: вершинный и индексный на самом деле их больше да и их структуру определяет юзер, но не суть. Вершинный - позиции вершин в пространстве, текстурные координаты и тд. Индексный - порядок их отрисовки.
Так вот, работа с этими буферами осуществляется через один и тот же интерфейс, отличие там только в том что указывается (передача константы) что это за буфер - вершинный или индексный.
Сейчас я этот тип указываю в конструкторе, а не хочется у каждой переменной это писать. Хочется сделать псевдоним и писать VertexBuffer, а не просто Buffer.
Очень не хочу переписывать. Точно нет способа проще?
>>843775
> Сделай ему инсталяшку.
Хуита какая то
Вот че за бред? Почему так сложно собрать небольшую программу? Получается ваш qt хуйня по типу электрона. Ощущение, что чтобы написать эффективную программу с гуем нужно самому все на опенгл или вулкане делать.
Можешь попробовать посмотреть, как qBittorrent сделан. Там у меня в папке всего один бинарник весом 25МБ.
> Вот есть у меня программка небольшая. Просто график по физике строит. Нужно скинуть преподу.
На, держи. Думаю бинарник + дллки вместе меньше 10мб будут весить
https://github.com/epezent/implot
>Получается ваш qt хуйня по типу электрона.
Не, это хуйня по типу дот нет. На нем можно делать небольшие проги, но для этого основные либы должны стоять у каждого юзера по умолчанию.
Ну ты можешь делать наследование, если так хочется писать тип. Но мне кажется проще сделать функции конструкторы и потом типа auto b = makeBufferWrite( параметры );
> Но мне кажется проще сделать функции конструкторы и потом типа auto b = makeBufferWrite( параметры );
Сейчас у меня тоже самое и не никаких лишних функций не надо.
То есть ты хочешь некий аналог newtype из Хаскеля: по сути тот же объект, просто с другим типом, чтобы случайно их не спутать?
Наверное, не знаю как это в хаскеле работает.
Короче говоря. Хочется алиас конструктору с определёнными параметрами и всё.
Чтобы я только объявил переменную и начал с нею работать без уточнений в конструкторе.
Так унаследуйся просто от Buffer и сделай там конструктор который будет вызывать конструктор Buffer с нужными параметрами.
Да, наверное, это самое простое что можно сделать.
https://en.wikibooks.org/wiki/More_C++_Idioms/Named_Constructor Оно?
Всё равно присваивание и вызов каких-то функций.
> По умолчанию где?
Ну везде, не?
> Лучше чем?
Размером => быстродействием. Ну может компилироваться будет дольше.
> А пачиму нельзя компилировать qt из исходников как какой нибудь boost? Разве так не проще?
Сборка Qt с флагами по умолчанию занимает несколько часов, спасибо веб-быдлу, которое везде суёт свой говнохром.
Без webengine сборка занимает около получаса.
Если нет virtual, то не притянет.
А если добавить final, то скорее всего вообще никакого оверхеда
Ты про весь фреймворк? Я про свою собственную прогу. Вот в бусте я заинклудил файлы, и компилятор потом просто функции которые я использую скомпилировал. С qt чому так нельзя?
В boost почти все библиотеки - header-only. Например, boost::threads ты вряд ли сможешь использовать, не собирая предварительно.
Qt имеет кучу внутренних зависимостей, т.е. чтобы использовать виджет нужно компилировать очень много файликов из qtgui и qtcore. Охуеешь это делать каждый раз.
Распространенная проблема судя по всему.
Почему так? Ну хз, последовательность байт совпадает с каким то вирусом может быть.
> Почему так?
Тебе же сказано: шин10. Теперь мелкософт за тебя решать будет что можно запускать на твоём компе за твои деньги, а что нет.
Какой консенсус или общепринятый стандарт по структурированию заголовков и реализации? Когда гуглил, очень часто натыкался на мнение, что заголовки должны содержать только объявление классов, напрмер, а вся реализация должна быть в .cpp файлах. Но в то же время я вижу много header-only библиотек, если реализация в заголовках это антипаттерн, то почему его так активно используют в достаточно популярных инструментах?
Правильно ли я понял, что строку с #include "my_header.hpp" компилятор распарсит как обычную копипасту, а сами заголовки не компилируются? Т.е. в случае если у меня есть файл main.cpp, и в нем я сделал #include "my_header.hpp", то при компиляции содержимое заголовка будет вставлено в main.cpp как инклюд, и скомпилирован будет только main.cpp?
Header-only библиотеки удобнее, но компилируются медленнее (т.к. их каждый раз надо компилить и парсить в каждом .cppшнике). Хедеры + .cpp - менее удобно, зато быстрее компиляция.
Если библиотека состоит из ехали шаблоны через шаблоны - там ничего нельзя положить в .cpp файл, вот они все и в хедере.
>Правильно ли я понял, что строку с #include "my_header.hpp" компилятор распарсит как обычную копипасту, а сами заголовки не компилируются? Т.е. в случае если у меня есть файл main.cpp, и в нем я сделал #include "my_header.hpp", то при компиляции содержимое заголовка будет вставлено в main.cpp как инклюд, и скомпилирован будет только main.cpp?
да
>Если библиотека состоит из ехали шаблоны через шаблоны - там ничего нельзя положить в .cpp файл, вот они все и в хедере.
А если имплементация шаблона в срр файле?
Уже который раз писали в треде, что только в hpp можно шаблоны инициализировать
Пчел ты
Сложность в подводных камнях которые могут появится там где ты не ожидаешь. Ну и шаблоны тоже довольно таки сложная штука.
>Сейчас на ООП которое мои знакомые называли самой сложной частью языка. Но мне нихуя не сложно, всё понимаю
Смоделируй в ООП лифт для бизнезцентра, знаешь такой который подбирает людей по пути.
Знакомые это вася из девятого класса?
ООП не только в плюсах есть кстати. А сложность крестов в том, что туда понапихали всякого разного, не фильтруя ничего, и продолжают пихать. Один и тот же код ты можешь написать столькими вариантами, что когда придет время прогать на плюсах ты будешь думать не о задаче, а какие технологии языка вообще юзать. Ну и еще есть такая штука как UB.
Так что если ты школьник, а ты скорее всего он и есть, то выучи паскаль и не выебывайся - толку больше будет.
>Сложность в подводных камнях которые могут появится там где ты не ожидаешь
Это-то понятно, оно всё с опытом придёт.
>шаблоны
Ну посмотрим що це таке, вдруг и их не прочувствую.
>>845494
Сам делай свои тз, тем более что задача на первый взгляд тривиальна.
>>845535
Один пчёл из яндеxса, другой по его рассказам на аутсорсе что-то для проджектов делает.
>ООП не только в плюсах есть кстати.
Это понятно.
>А сложность крестов в том, что туда понапихали всякого разного, не фильтруя ничего, и продолжают пихать. Один и тот же код ты можешь написать столькими вариантами, что когда придет время прогать на плюсах ты будешь думать не о задаче, а какие технологии языка вообще юзать.
Ну так круто же, не люблю загонять себя в рамки.
>Ну и еще есть такая штука как UB.
В курсе, читал + сталкивался, учусь не допускать.
>а ты скорее всего он и есть
Мимо
>паскаль
Нет, спасибо.
>Сам делай свои тз, тем более что задача на первый взгляд тривиальна.
Ну то есть ты не шаришь в ООП и просто пришел выебнуться, ясно.
Шарю и уже неплохо так поработал с этой темой. Конечно не без нюансов но суть я понимаю и с многиими задачами справиться смогу. Но лифт для бизнезцентра который подбирает людей по пути если мы говорим о простой модели без ухода в лоулевел и электронику - дело пары-тройки методов и не более того.
Для инстанцирования шаблона в транслейшен юните необходим его полный код.
Эффект Даннинга-крюгера
Вот, например, есть некий виджет который отображается в определённом режиме редактора (скажем, как в графическом редакторе рисуешь кистью у которой куча настроек). Что-то он хранит во внутреннем своём состоянии, а что-то получает извне: текущий выбранный цвет, текстура и тд.
Так вот, как хранить это внешнее состояние? Нужен какой-то класс, на вроде, контекста?
Вообще можно попроббовать так сделать - будет похоже на шаблоны
boost_root и boost_librarydir добавил после того как find_package(boost ...) этот самый буст не нашел, а тут вот это говно вылезает.
как править? пробовал закомментить find_package, вроде собирается, но студия потом ошибками плюется.
Удали кэш и заново сконфигурируй, видишь, он пишет, что буст фуллкапсом, хотя ты уже так сделал
Из плюсов только в ШУЕ ППШ можно вкатиться
не отрицаю, если бы в крестах разбирался, у меня бы и вопросов скорее всего не возникло бы
но вот в шарпе я тоже совсем не главный индус, а сколько реп не качал, ну день максимум ебался, большая часть и сразу с полпинка на моей машине заводилась.
а тут одна либа из пачки - уже два дня ебусь.
vcpkg install boost
vcpkg install boost
Что не делал всегда ошибки
https://pastebin.com/MiAN6Fpz
В ДС, понятное дело
Иди в команду разрабов эльбруса
Есть вакансии в ИКИ РАН.
где мой старый добрый C++98?
Нечитаемое говно с кучей подводных камней, исключений из правил, хуй знает во что разворачивающееся в асме. for(int i = 0; i<...; i++) в разы понятнее.
Я занимаюсь) гугли компании входящие в Ростех, и находи ближайшую. Платят так се, зато будешь за копейки ездить в санаторий зелёная роща, сразу за Мацестой и у нас нет печенек.
>хуй знает во что разворачивающееся в асме
Верь в компилятор. Полагайся на него. Надейся на него. Делай ему регулярные жертвоприношения. Компилятор даст тебе мудрость и ответы на все вопросы. Верь в компилятор.
limit равен 320х320 = 102400, а heightmap - это QVector<quint16>
Ты проверяешь производительность в дебаге? Пиздец.
Бамп вопросу. Как можно быстрее манипулировать содержимым конейнеров?
он не стал выразительней, он стал скучнее
к примеру, раньше для программирования в компайл-тайм приходилось использовать по сути функциональный подход - вместо циклов была рекурсия через инстанцирование, вместо условных конструкций была форма паттерн-матчинга, компайл-тайм переменные эмулировались через enum, и прочее
это было забавно
Ты был прав, анон! Спасибо большое.
for (int i = 0; i != 666; ++i) vec.push_back(new MyClass());
В каком случае будет утечка, в этом
for (auto& i : vec) delete i;
или этом?
for (auto&& i : vec) delete i;
Не знаю, я вот С++11-14-17 очень хорошо скушал.
Концепты и модули тоже понемногу кушаю, обзорно по фичам С++20 проехался.
Проседаю в некоторых сложных темплейтах, но это исправлю.
Ни в каком.
В случае если в push_back вылетит исключение.
Клади unique_ptr.
Я правильно понимаю что теперь хуй проссышь, выполняется данный конкретный код в компайл- или рантайме? Раньше хотя бы маркером служили трехэтажные конструкции из шаблонов.
хм, нет, понять можно конечно же
просто стал возможен императивный подход в компайл тайм
это скучно
Скучно ему, блядь. Я вот затрахался городить длиннющие простыни. Сегодня же, хвала constexpr-у, подобное проще писать, читать и поддерживать. Ну и если аккуратно использовать новые финтиплюшки, то время компиляции оказывается ощутимо ниже, чем у соответствующих по функционалу старых конструкций.
Эта ебля конечно угарная, с точки зрения академической ценности, но в прод ее никто бы никогда не пустил. А с современными иф констэкспрами и прочими вариадиками - это реально теперь в проде писать, как например делаю я.
Нечего по сути сказать? Значит, доебёмся до слов. Я же писал художественного стиля пост на двачике, а не технические спецификации, смысл докапываться?
Просто не надо учить то, необходимости чего не осознаёшь. Пользуйся сначала малым подмножеством языка, по нужде со временем потихоньку освоишь всё, что есть, и будешь просить комитет выкатить уже наконец те самые давно обещанные плюшки.
В целом согласен, но не хватает что-то вроде uniform (now for real) uniform initialization
Это точно. Жду, когда на работе коллеги перейдут на свежий msvc. Выкину наконец велосипедный span, вставлю в энное количество мест концепты вместо шаблонных уродцев и комментариев
Не выучив не сможешь читать код коллег/опен сорса, где вася добавил конструкцию просто потому что захотел выебнуться.
Ну consteval, какая разница
Ух сука, не напоминай. Кстати, в 20 же наконец выпилили list-initialization в пользу aggregate+designed?
Требуемая компетенция для чтения кода и его порождения всё-таки сильно различается. Для чтения часто хватает общего понимания и гугла.
Понятно конечно, что можно перебирать делители, но это ебнуться можно. А решето не подходит по описанной выше причине. Хз че делать.
Наверное, я все таки так и сделаю, потому что другого выбра у меня нет. Тем более у меня есть некоторые ограничения на эти числа. + в отличии от решета это можно распаралелить довольно просто.
Так это задача супер компьюеторов нахуя её делать на своем пк кроме как для эксперимента? Найди лучше их в интернете
Немного не так поставил вопрос. Почему с++ популярнее просто c? Или того же rust?
Почему условная дрель бош популярнее ручной дрели? Почему она популярнее дрели завода "ударник"?
Не знаю! Почему???
В C++ есть куча плюшек, которые нравятся даже сторонникам девственно чистого Си. Плюс под виндой Си компилятор от мелкософтов до недавнего времени только C89 поддерживал, поэтому все компилили даже сишный код как плюсовый. Ну а раз так, то грех не воспользоваться каким-нибудь из овердохрена фишек.
Так нахуй нужен просто си если есть с++ который по сути то же самое, но с дополнительным функционалом?
Веду эффективную разработку, продвигаю использование новых фич в имеющихся проектах (при создании новых подсистем в них), выступаю с презентациями среди остальных коллег по конторе.
Ну и саммоу приятно в хобби-проектах.
Почему наглый компилятор совершенно спокойной генерирует в данном случае copy-constructor, при использовании которого второй объекта инициализирует свой reference с помощью member variable первого объекта?
В итоге когда кончается lifetime первого объекта, во втором получается dangling reference.
Ни одного ворнинга!
Я щитаю, в таком примере copy-constructor должен быть implicitly-deleted. Или хотя бы не делать то, о чём не просят.
НАДО. Ну вообще я думаю мой комп справится. На андроид есть приложения для поиска простых множителей. До 12 степени за секунду находит. А мне 11 нужна, правда много. Короче так и сделаю. Что, ни у кого такого желания не было?
Для решета эратосфена
Тебе нужны прямо все простые в этом интервали, или только проверить, является какое-то конкретное число простым или нет?
Многие. Пару условий есть на них. Ну читай мои ответы. Я там уже почти определился.
Пчел, ты не знаешь, что такое ссылка, следовательно твой код по умолчанию говнокод.
))
Я прекрасно знаю, как работает этот код и что происходит внутри compiler-generated copy-constructor в данном случае, мне просто это не нравится.
Ты -O0 что ли оцениваешь? Пробуй с -O2 или -Ofast
int v = int::Parse(eFName->Text);
а как получить тип string?
Во-первых, пошел нахуй.
Во-вторых, какой тип по-твоему имеет eFName->Text? Если такое непредставимо богомерзкое творение хаоса как С++.NET имеет в бездне своей архитектуры безумия хоть частичку логики постижимой разумом смертных, то это как раз и будет тип string.
Ну что же ты такой тупой блядь.
затем, что в этом мире есть очень много экзотического железа, под которое нужно писать компиляторы (да, С компиляторов есть на бОльшее кол-во железок). Написать нормальный компиль на Си еще реально, написать же рабочий и валидный, не срущий багами, компиль на С++, который, к тому же, поддерживает современные стандарты языка, это ЕБАНЫЙ АД, легче с нуля написать полноценную ОС, ей богу.
зрелый язык со всеми возможными реализованными парадигмами, позволяет обмазываться и ООП, и процедурщиной, позволяет перекидывать овердохуя вычислений на компайл-тайм (привет метапрограммирование и constexpr), в виду присутствия UB позволяет фривольно творить больные вещи, правда на страх и риск говнокодера, имеет Тьюринг полные темплейты (да, это отдельный язык программирования внутри плюсов), имеет 250 миллиардов слоев абстракций, при этом высранный компилятором бинарный код по скорости исполнения очень близок к скорости исполнения бинарного кода после компиляции чистого Си кода (на аналогичной машине, ессна). Плюсовые компиляторы уже умеют хорошо оптимизировать машинный код, что тоже немаловажно. Всеми известный и уже фактически родной С-подобный синтаксис. Очень хорошая интеграция с Си (лучшая так-то), а на С написано овердохуя софта за 50 лет существования языка (примерно 90% библиотек, все ядра всех известных ОСей и т.п.). Из-за ебанутых темплейтов позволяет внаглую читерить - например, в С++ возможен статический полиморфизм, который эксплуатирует поведение темплейтов при наследовании, минуя нужду в виртуальных таблицах, по которым работает динамический ad-hoc полиморфизм, который довольно медленный. Причин еще очень много, плюсы одновременно и манна небесная, и говно ебаное червипидорское, но это обязательные условия для того, чтобы язык был юзабельным в широких массах, как бы парадоксально это ни звучало.
>с++ популярнее просто c
Это неправда. С популярнее плюсов, даже в 2к20. Такие дела, да.
>rust
В лучшем случае займет околоГОшную нишу, в худшем - сдохнет, так и не выстрелив как следует. С и С++ он никогда не сместит с царства байтослесарства по очень многим причинам, многие из которых даже больше связаны с экономикой и челоеческой ебанутостью, нежели непосредственно с программированием.
был бы умным тут не сидел
Бэкенд для шланга написать несложно
Date::Date(int yy, int mm, int dd)
: y{ yy }, m{ mm }, d{ dd }
{
if (!is_valid()) throw Invalid{};
}
bool Date::is_valid() {
if (m < 1 || 12 < m) return false;
if (d < 1 || 31 < d) return false;
}
Ты в курсе, сколько дополнительных потоков создаётся при запуске твоей программы?
Нет. Я думал только поток консоли и сама прога.
Хз честно. Говорю же, я не понимаю зачем столько
В cpp20 с появлением модулей как нибудь сборка облегчиться? Или все так же надо будет страдать от cmake с миллионами строк?
можно ли будет какой то аналог cargo получить, пусть даже без пакет менеджмента?
https://pastebin.com/vRCvnjAr
Сколько?
> пусть даже без пакет менеджмента
> conan
Я опять всё проспал чтоли
Он перестал быть чистым пакетным менеджером?
>Или в цикле периодически проверять наличие сигнала.
хех, коммент прекрасно отображает на каком дне крестоблядский тред в /pr
Спасибо
Посмотри ассемблер, посмотри профилировщиком по памяти (емнип он входит в Community версию студии).
>В лучшем случае займет околоГОшную нишу, в худшем - сдохнет, так и не выстрелив как следует. С и С++ он никогда не сместит с царства байтослесарства по очень многим причинам, многие из которых даже больше связаны с экономикой и челоеческой ебанутостью, нежели непосредственно с программированием.
Уже смещает, FAGMAN активно начал топить за Раст
Одногруппник твой?
> conan
Ну не может быть пакетный менеджер, библиотеки для которого собирает какой-нибудь васян
хайль
маняфантазии свои оставь при себе
Гугл за свой дарт тоже топил, якобы убийца джава скрипта. И что из этого вышло? нихуя :) Если мелкософты скромно пукнули по поводу раста, мол, пук-среньк, безопасность лучше, то это не значит, что для раста реально достигнуть уровня С и С++ в плане глобальной распространенности. Все равно ниша С и С++ - это ебать байтики, где раст должен обмазываться ансейфом, дабы тоже ебать байтики как следует, что возвращает проблемы безопасности памяти как в С и плюсах. Короче, не в этой жизни.
Кекай дальше, зуммер.
vcpkg - это будущее. Ни одна уважающая себя контора не будет использовать собранные непонятно кем библиотеки.
в microsoft васянство прекратилось примерно году в пятнадцатом, вместе с выпуском vs2015
От того что индус носит бейджик менее васянским он не становится.
а когда результаты начнут на продуктах сказываться?
что не так с продуктами? Они охуенные и лидеры в своих отраслях.
Тот же компилятор МСВЦ первым начал модули поддерживать, например
Это целичисленное переполнение. Переполнение буфера это выход за границы массива типо char buff[10]; buff[228] = 0;
Я знаю, что если я верну, допустим, вектор из функции, то он не скопируется в функцию, куда возвращается поток исполнения, а переместится само владение над ним (NRVO вроде как называется). Это работает только для возвращаемых значений, верно?
Что тупого? Если ты умный, объясни мне, тупому, почему vs мои пару байт переменных оптимизирует в гигабайт?
Картинка одна на рефреш? Можно притвориться HTTP сервером (тупо захардкодить все ответы сервера) и отдать нужную картинку на каждый запрос.
Кстати, если не удалось выполнить эту оптимизацию, то вызывается конструктор перемещения (если его нет, то конструктор копирования)
>Но вызов функции насколько я помню довольно дорог
Зависит от множества факторов. Если компилятор заинлайнил функцию, то вызова по сути нет. Если функция листовая (не вызывает других функций), то компилятор возможно положил болт на соглашение вызовов и соптимизировал их. Если вызовы непрямые (indirect) то возможно тратится не на вызов, а на хождение по указателям. И тд. А может у тебя вообще не там время теряется. Всё возможно.
tl;dr профилируй и читай асм
> Зависит от множества факторов. Если компилятор заинлайнил функцию, то вызова по сути нет.
Dfs предполагает рекурсию, а как я помню рекурсивные функции инлайниться не могут
> Если вызовы непрямые (indirect) то возможно тратится не на вызов, а на хождение по указателям.
Тут я даже хз что этт
> И тд. А может у тебя вообще не там время теряется. Всё возможно.
> tl;dr профилируй и читай асм
Ок
>Dfs предполагает рекурсию, а как я помню рекурсивные функции инлайниться не могут
Depends. Tail call optimization.
>Dfs предполагает рекурсию
Ты не через явный стек делаешь? Я думал у тебя куча вызовов каких-то других функций происходит.
Никому не интересен твой вопрос, ты вообще не пытаешься потратить время на изучение.
Запустил. Твои действия?
Не, картинок много, и посылаются в различные интервалы времени. Сам сервер обратную связь не получает.
Чел, как мы без кода должны определить, что ты там понаписал на 1гб?
Сап хлопцы, скажите пожалуйста где вы юзаете лямбды, и сильно ли это ЮЗФУЛ, я просто в connect В qt заюзал и понял что годнота для этой цели, но потом задумался а где они ещё полезны, и как то не придумал ничего.
помимо довода крестогосподина свыше, лямбды можно использовать для того, чтобы писать короткие функции (т.н. анонимные) внутри функций, если не хочешь писать отдельную функцию под какое-то относительно простое действие.
Только там где реально нецелесообразно плодить классы и функции, что-то короткое и понятное.
Так-то обычно это нарушение абстракции и выкладывание наружу кишков.
Не хочешь - не используй, тебя сам язык не форсит юзать лямбды, даже в качестве прекдикатов (хотя там это норм выглядит, в отличии от функторов, что есть бойлерплейт еще тот)
Помогите, пожалуйста
Как вообще можно решать формулу? Что ты несёшь, поехавший?
В латехе это просто
f(x,N)=\sum_{n=1}^{N} (-1)^n \frac{x^n - 0.1 \cdot n}{n}
Как я понял, тебе нужно посчитать f(x,19) для заданного x?
Ок, а как заставить других не загаживать код?
Программы не придумывают, а составляют по шагам.
Первый шаг - запрограммируй рассчет только первой дроби.
Потом - двух. Потом - трех. Потом увидишь повторяющиеся части твоего кода, которые сможешь обобщить.
Ты циклы проходил вообще, гуманитарий?
Вижу здесь широкий простор для темплейтов.
Скажи, нахуя ты поступал на такое направление? Мало того что вам хуйню школьную преподают, так ты даже в этом не шаришь
Анон, ну камон, здесь же телескопический ряд налицо. Возьми произвольное значение степени икс (или знаменателя, неважно, в этой последовательности они идут нога в ногу каждую итерацию) и разложи дробь. Тем самым тебе будет легче увидеть закономерность последовательности. Как только загуглишь телескопический ряд, разложишь последовательность как следует, тогда и алгоритм решения уже будет ясен. Как можно такое решать НЕДЕЛЮ? Пиздец, не обессудь.
Тебе тут ответили достаточно злые люди, хотя в чем-то я с ними согласен, но не буду размусоливать, как они. Сделай как говорит анон>>853705
Если не осилишь, то я спасу твою домашку, на код, сиди и вникай. По типам если есть какие-то особые требования от препода - поправь сам. И да, вангую, что такие задания дают с ограничением - не юзать либы типа math.h, а чисто от руки ебануть цикл, который все посчитает, что я, в принципе, и сделал.
https://pastebin.com/6Ygfb3by
Ты думаешь, что если он рили гуманитарий до мозга костей, то закончит инст по технической специальности? Даже если закончит, хуй его возьмут на что-либо ответственное.
Максимум, что этому челику светит - это веб-макакерство или куа, какие самолёты, кек
салют за метапрограммирование (бедный анон-неосилятор походу вскроется, когда откроет твою простыню), но у тебя невалидная программа кажись. При х = 3 и степени 2 получается -1.5, а у тебя 4.3 (засим и по знаменателю 19 выйдет неверное число, так как ты не учел наличие телескопического ряда)
while (true) {
std::string command;
std::getline(std::cin, command);
if (command == RESTART) {...}
...
foo();
}
Как сделать так, чтобы программа не ждала ввода, а цикл крутился дальше, пока пользователь не напишет что-то и не нажмёт энтер? Я пробовал через std::cin.peek(), но что-то как-то не понял как нормально это сделать.
По идее, под это можно отдельный тред выделить, но это как-то слишком расточительно, если я правильно понимаю как это работает.
А отдельный тред не отожмёт целое ядро, учитывая, что 99% времени в нём ничего не происходит? Или нормально всё будет?
Не отожрёт, равно как и std::getline в твоём примере не отжирает целое ядро в ожидании инпута.
Другой вариант, без тредов, это использовать системное API для работы с консолью. То есть PeekConsoleInput для винды и ебатня с termios для юниксов. Но это, естественно, будет работать только для конкретной операционной системы и разбивать на строки тебе придётся самому. Поэтому да, всё-таки проще вынести обработку ввода в отдельный тред.
>А отдельный тред не отожмёт целое ядро
Пока поток заблокирован в ожидании чего-то (в данном случае ввода с клавиатуры/чтения из stdin), ему система даже не будет выделять время.
Переменная шрёдингера - если ты не используешь результат вычислений, то и узнать осталась ли переменная ты не сможешь. А если используешь, то не узнаешь, была ли там переменная или только результат.
Нихуя он умный (я про компилятор)
В .h:
template < typename T >
void func(T.......);
В .cpp
template < typename T >
void func(T.......) {
......
}
Выдает ошибку undefined reference to. Что не так?
а все, я понял какой там прикол с компиляцией
Дефайнить темплейты в хедеры или пользоваться explicit instantiation.
Либо инклудить имплементацию из хедера (в духе какого-нибудь .inl)
Три варианта.
Примерно как тут: https://github.com/google/breakpad/blob/78180df608bf0d0181fd1b096ec98d1354b640d0/src/client/mac/tests/crash_generation_server_test.cc#L218
Запускается launcher, в нём создаётся CrashGenerationServer. Дальше он стартует, если успешно, то в fork'е открывается моя приложуха. В ней создаётся ExceptionHandler с таким же портом, как и CrashGenerationServer
В CrashGenerationServer передаю callback только на краш
В ExceptionHandler callback'и не передаю
Бамп
Знать ключевые слова с++98 и фишки из нескольких последующих стандартов.
Знать STL на уровне "создать коллекцию с составным ключем и проитерировать, удаляя элементы".
Знать вумные указатели.
Уметь написать свой String.
Уметь читать исходники Boost.
> Уметь написать свой String.
> Уметь читать исходники Boost.
Это нахуй не надо. String уже до тебя будет написан, с бустом если что google поможет
Изи же
Ну так и джун не сильно далеко.
Чаще всего объекта уже нет, он делетед
String в каждом проекте пишут свой, поэтому входит в обязательный список джуна.
На разных проектах бывают нужны разные стринги. Например ropestring для текстовых редакторов. В БД могут быть нужны другие.
Там столько нюансов, что ты пизданёшься.
Вообще не соображаю, уже пару часов долблюсь. Почему 21 строка выбрасывает free(): invalid pointer? Почему утечка? Почему строка не возвращается? Нихуя не пашет, помогите
18 строчка, как я понимаю ты передвигаешь указатель на начало строки в обратную сторону. Как следствие указатель у тебя улетает в неизвестном направлении. Попробуй пройтись по шагам. Но могу и ошибаться.
Не меняй никогда исходные указатели. Завели новый и его инкрементируй/декрементируй/складывай, да хоть корни извлекай, если сумеешь.
Исходный и удалишь потом и увидишь заодно, что та копия, которую ты гонял, не равна исходной.
Либо ты при заполнении массива за границу уполз.
Это С++ тред.
Зачем тебе освобождать память по адресу, который ты возвращаешь?
Ищи dosbox-0.74-2.conf или как-то так.
Там в разделе [sblaster] указан этот irq, dma и порт (220), это все параметры.
Tile — клетка на карте;
Chunk — двумерный массив тайлов;
Map — двумерный массив чанков;
WorldMap — содержит несколько объектов Map, например, общую карту и карты данжей/энкаунтеров/личного дома игрока и т.п.
Так вот. Собираюсь объявить их вложенными друг в друга, т.е. Tile в Chunk, Chunk в Map и т.д. Всё правильно делаю?
Или лучше объявить их вообще без вложений, но в анонимном неймспейсе, чтобы наружу не торчали?
А в чём проблема просто практиковать то, что изучил за прошедший урок, дроч и ебля нудная, но ты и не на питон решил залезть. А вообще, всякие хакерваны и иже с ними, если лень ставить самому себе адекватные задачи.
Чекни C++ Primer 5/6 издание, они вроде как раз об этом.
И еще Карьера программиста, там тоже задачки с ответами.
> при каких условиях стоит оборачивать код в отдельные неймспейсы
При конструкциях всяких шаблонов. Можешь поглядеть какие-нибудь либы и ты увидишь, что там основная реализация находится в detail. Туда погромист ходить не должен и юзать функции оттуда тоже не надо.
А так вообще для структуризации кода: вот функции математические, вот работа со строками какая-нибудь и тд
класс может предоставлять минимальный интерфейс, а часть функционала может быть вынесена в функции-помощьники, а объединены они могут быть в единую логическую единицу неймспейсом
Господа, а что можно писать на плюсах? Нет-нет, все мы знаем, что то угодно. Вот конкретно. Где работать, что делать. Желательно побольше конкретики. Слышал про игры. Хорошо, а где, а как, если не sfml. Что ещё можно? А о про питон также писали что можно всё, а в итоге один бэкэнд по вакансиям
>Господа
так и представил как ты сидя в белоснежной рубашке и галстуке-бабочке (но в обтруханых трусах за проперженным стулом) отстукиваешь этот мессидж
"господа, где бы мне поднять бабла"
водишь жалом
ну ничего скоро ты поймешь всю глубину кроличьей ямы
с++ эзотерический язык программирования и работы на нем в 20к нет и не будет больше
Всмсл ? Вообще-то так и есть, и в 2020 году уже всем известно, что теперь на рынке эзотерического программирования нечего делать, если это не программирование на картах таро. Читай Scratch
Всегда поражало, к каким выводам могут прийти люди, никоим образом не связанные с C++.
Признайся, ты же его в последний раз использовал на первом курсе?
мимо 2к/нс крестовик
Все отдельно кроме чанк, т.к. чанк это не игровая сущность, а деталь реализации карты, и должна быть на другом уровне абстракции, т.е. вообще не видна при написании игровой логики.
Можно складывать данные без логики и не писать public.
Мне всегда представляется, что класс это что-то большое с капитальной работой и логикой.
А структура это что-то небольшое, в ней 3-4 переменных которые могут являться какими-то указателями или индексами на что-то другое.
POD
Структура это просто способ синтаксически показать что там независимые друг от друга данные, которые ты можешь задавать без каких либо ограничений.
неверное представление
в с++ структура - это не более чем класс с чутка измененной семантикой, а именно с тем что по умолчанию данные в нем имеют модификатор доступа public
забавно, что семантика была изменена в угоду синтаксическому удобству
ну а применение, да - POD
Если ты несколько лет проработал на плюсах за 20к то у меня для тебя плохие новости.
Блять, да куда вы лезете, долбоебы? Нахуй тебе visual studio блять? Тебе чтоб вкатываться хватит компилятора в консоли + sublime text. Visual studio вкатывальщику только лишний геморрой добавит.
> Неосилятора рвёт
Найс у тебя детектор, пердольная манюня. Я всего-то сениор уже больше 4х лет.
Ну если сейчас действительно такие синьоры пошли то я спокоен в вопросах конкуренции.
>Микрософт, Нвидия, Яндекс
Намомни-ка, в какой компании из этого списка ты работал, а, синьор-помидор без консольки-пердольки?
Какая разница, где я работал? Я на своей работе так же использую студию, 1 кнопка - сборка и деплой. 1 команда в CI - сборка и деплой. Без каких-либо скриптиков и прочего васянства.
Я понял, значит толстота. Но несмотря на то, что ты очередной даун коих большинство на этой планетке дам совет - чем тролить на сабж параше почитай образовательных книг. Тогда быть может и воплотишь часть своих желаний в жизнь.
А сказать то что-то по делу можешь, советчик хуев? Поверь, я то знаю о чем говорю.
Конечно могу, сможешь ли ты правильный вопрос задать. Я же именно ради маргиналов вроде тебя магистра получал. Сейчас буду расписывать вниманиебляди на двачах основы выпуска проекта в релиз.
Ну то есть ничего, кроме как попонтоваться бумажкой, которой можно сраку вытереть. Достойно.
>без васянства
>мокрописька от M$ которая даже не работает если не залогиниться под именем фамилией
Как оригинально. Ты всего лишь десятитысячный синьор без высшего которого я повстречал.
Расскажи, анон, как происходит "деплой" и что делать, если он должен происходит как-то иначе.
щас бы на полном серьезе считать, что проперженная вышка из любых говновузов что-то дает. Ну окей, кроме НГУ и еще 2.5 вузиков.
НГУ == МГУ
https://docs.microsoft.com/en-us/windows-hardware/drivers/develop/deploying-a-driver-to-a-test-computer
На 1 кнопочку нажал, все автоматом собралось и пролилось туда, куда тебе нужно. Если нужно что-то иначе - там менюшечки есть, где можно кастомизировать все, что нужно. Но в моих юзкейсах достаточно было стандартной конфигурации. То самое ИЗКАРОПКИ
Очевидно придется идти к пердоликам, умолять их написать скрипт для тебя.
Такие вот "програмизды" в 2к20.
Так или иначе придётся все строки после удаленной переписать.
Читай файл по строчкам.
Если не знаешь даже такого - читай по символам, собирай в строчки сам.
>Читай файл по строчкам
Ну и? Как удалить-то строчку не помещай всё в новый файл? Неужели никак нельзя удалять символы прям из файла?
Ну, ты можешь читать и писать в тот же файл, вроде бы открыв его как "rw" и гоняя взад-вперед Seek.
Да я уже письмо написал, что они ахуели и можно сделать всё легче. Буду сидеть жать. Надеюсь не пригодится и не придётся в этом ковыряться
Это все очень просто. Может быть ты просто не туда работать устроился?
Загрузи в облако каждую строку в отдельном файле с именем строка№.txt. Потом читай все файлы назад, кроме одного, и дописывай в исходный.
Ищи в своем коде UB. Оно может вызывать другие функции. Либо порчу стека.
Блин, где вы работаете? Эта хуйня для школьников, а не задание. Еще говорят что в C++ высокий порог вхождения
Весь файл кроме строки для удаления начать писать в другой. Потом оригинал удалить, новый файл переименовать
А потом удивляются, почему при апдейте игрушки размером 30Гб не хватает жесткого диска на 50Гб.
1280x720, 0:26
Эти беды мне помогают. Один прогер изобрёл не повторяющийся лабиринт в игре из 90-х под ЛСД, так до сих пор понять не могут как работает код
>>858481
A S S we can
>>858492
Сколько лет вы работаете в костылистроении?
>>858539
НЕЛЬЗЯ в другой файл. В итоге сделал так, что при чтении строки |pidori| каретка переходила на новую строчку. Составил два списка с полными строчками и с пропущенными.
Инструкции процессора
Как угодно, это не регулируется языком.
Ок, а что например в сфере каких-нибудь нейронок? Там же уникальность явно побольше? И что вообще учить/практиковать чтобы уметь и быть востребованным именно в оригинальный контент?
Один из главных скиллов программиста - не изобретать велосипеды как раз, а максимально переиспользовать существующие наработки
Ок. Какие-нибудь советы как искать эти наработки помимо очевидного гугления и дрочинга гита?
Огонь, спс.
Ты даже представить не можешь, сколько человек не может написать хоть какое-то решение, пиздец просто.
Спасибо ушлым долбоёбам, которые впаривают быдлу говнокурсы
Но ведь для плюсов не достаточно тупо посмотреть курсов, это же не веб.
Нейронки по большей части "переизобретают" уже открытое в 1950-х, просто тогда вычислительных мощностей не было.
seekg если ifstream, аналогичные OS API функции а-ля SetFilePointer, если не ifstream
rewind(FILE ⛧);
я не вижу ничего плохого в тренировке
Ну там был недоязык и галера. А к си сплюснотуму какие-то тёплые чувства, из-за возможности байтоёбствовать и писать высокоуровневые вещи. Что-то мне в нём нравится.
vector<int> some_vector(5, 10);
Создает вектор с пятью элементами, каждое из них инициализирует значением 10.
vector<int> some_vector { 5, 10 };
Создает вектор с двумя элементами: 5 и 10.
Плюс есть разные контексты (auto type deduction, template type deduction (especially forwarding references)), когда uniform initialization object deduced as initializer_list, а это может быть не то, что нужно.
Щас наоборот главные по сиплюсплюсу признали, что uniform initialization хуйня, и рекомендуют вернутся к круглым скобкам
Есть программа, которая запускает один-единственный тред, и хочет его время от времени убивать и использовать заново.
Что-то типа:
std::thread thr(f);
//stop();
thr.join();
thr = std::thread(g);
1) Завести обычный bool. Менять его значение из основного потока и проверять его значение в дочернем потоке, чтобы съебнуть.
2) То же самое, но с atomic_bool. Есть ли смысл, если поток один?
3) Условная переменная (conditional_variable) с мьютексом, wait и notify_one. Читал, что иногда у wait происходят ложные пробуждения и с этим нужно что-то делать.
4) То же самое, но добавить bool или atomic_bool для перестраховки от ложных пробуждений. Самый сложный вариант.
Есть ли какие-то книги или статьи с хорошими примерами по типу описанной задачи и с грамотным разбором, как нужно и ненужно делать?
У них так всегда происходит, то же самое было с передачей параметров по ссылке и возврату, потом тоже назад отмотали, сказали лучше по значению как в 80-х.
>происходят ложные пробуждения и с этим нужно что-то делать.
Проверять условие. В данном случае условием будет значение atomic bool.
Только в таком простом кейсе достаточно этого самого atomic bool.
Не было такого потому что.
Но круглоскобковой инициализации действительно поправили пару корнер-кейсов в последнем стандарте.
Например, int i{228} или MyClass j{359} имеют какое-то преимущество по сравнению с int i = 228 и MyClass j(359)?
В твоём примере это одно и то же, если только MyClass не имеет отдельный конструктор, принимающий initializer_list
>кроме возможности контейнеру явно задать элементы
Не путай. Фича uniform initialization (то есть конструирование через {}) в том, что ты не натыкаешься на Most Vexing Parse и в некоторых случаях не надо явно писать имя класса, чтобы его создать (более подробно см. https://softwareengineering.stackexchange.com/a/133690).
Явное задание элементов - это вызов конструктора через initializer_list. И он всё портит, потому что конструкторы с его участием самые приоритетные и конвертируют всё подряд. Почему Комитет снова выбрал самое ужасное решение? Почему нельзя было сделать uniform initialziation действительно uniform и, чтобы достать до initializer_list, сделать что-то вроде vector<int>{{1,2,3}}?
Так я нуб. Уже джва года пытаюсь понять, что такое гонки, блокировки и прочая. Мне бы именно статью/учебник, в которой/ом демонстрировались бы данные проблемы и откуда у них ноги растут.
Ты педофил?
Есть несколько причин.
1) Оптимизации компилятора. Согласно стандарту, обычные булы не участвуют в общении между тредами. То есть если в коде у тебя нет специальных операций (обращения к атомарным переменным, захватов мьютекса и прочего), то компилятор может посчитать, что в коде типа
bool run = true;
auto t = std::thread([&run]() { run = false; });
while (run) {}
переменная run никогда не изменится. И просто дооптимизирует тебе до бесконечного цикла. Скорее всего он этого не сделает, но в теории это законно. Даже если конкретно этой оптимизации не произойдёт, компилятор (и процессор) могут переставлять операции чтения/записи относительно неатомарных переменных, что тоже может привести к печальным последствиям.
2) Собственно атомарность. Read-modify-write операции должны быть атомарными. Например, у тебя следующий код:
// Инициализация
int counter = 0;
// Тред 1
a = counter++
// Тред 2
b = counter++
counter++ - RMW операция (mov rax [counter], inc rax, mov [counter] rax). Оба треда могут одновременно загрузить x, увидеть, что он равен нулю, и оба последовательно запишут единицу. А могут и двойку. А вот операции над атомарными переменными... атомарны. Ни один тред не сможет увидеть половину операции. То есть если же counter был бы типа std::atomic<int>, то ответ был бы всегда 2, как и ожидалось.
На самом деле всё сложнее и в современных процессорах relaxed memory ordering, но по умолчанию в атомарных переменных используется самая сильная модель упорядочивания (sequential consistency), при которой не бывает никаких странностей. Поэтому если не ударяться в wait-free головного мозга, то про всякие release-acquire можно почитывать лишь на досуге, они нужны только если у тебя специфические задачи и тебе нужно выжать 100% перформанса.
Хороший человек. То есть все переменные, которые делятся между потоками, должны быть обязательно atomic?
Если кто-то записывает, а кто-то читает - да, либо атомарные переменные, либо использовать мьютексы.
Использовать не list.
std::find?
Хорошо. А подскажешь, откуда лезут ложные пробуждения при использовании условных переменных? Один пример вроде понятен. Родительский поток шлёт оповещение многим дочерним потокам, несколько потоков могут успеть пробудиться, но захватить управление успеет только один, значит, остальные потоки словили ложное пробуждение.
Но насколько я понимаю, ложное пробуждение может произойти, даже если дочерний поток один. Вот этого я не понимаю. Если никто не слал сигнал, то почему он пробуждается?
Двачи.
твиттеры читай ихние
Это требование ещё с посиксовых pthread_cond_t пошло. Наверняка в каких-нибудь восьмидесятых был какой-то вендор, *nix система у которого имела такую багофичу. Вот и внесли в стандарт. Бывает ли на современном линуксе - хз, говорят что возможно.
А, вот, погуглил и нашёл.
https://pubs.opengroup.org/onlinepubs/009604599/functions/pthread_cond_signal.html
>The effect is that more than one thread can return from its call to pthread_cond_wait() or pthread_cond_timedwait() as a result of one call to pthread_cond_signal(). This effect is called "spurious wakeup".
То есть, в плюсовых терминах, ты вызываешь notify_one, а пробуждаются сразу несколько тредов.
Спасибо. Жесть какая-то.
Появился ещё странный вопрос. Если я использую условную переменную в сочетании с atomic_bool, то как правильно сделать вызов notify?
Пример работы потока:
std::unique_lock<std::mutex> lock(mtx);
cv.wait_for(lock, std::chrono::seconds(10), []{ return exit; })
Пример основного потока:
exit = true;
cv.notify_one();
1) Насколько я понимаю, это неправильно, потому что компилятор может переупорядочить команды и получится, что сперва вызывается notify, а уже потом меняется atomic. Как сделать правильно?
2) Не совсем понимаю, как работает счётчик времени в wait. Он сбрасывается после пробуждения и начинает заново отсчитываться или нет? Не получится ли, что из-за ложного пробуждения поток будет стоять 20 секунд, а не 10?
3) Может ли поток проспать пробуждение? Например, посылается сигнал notify, и, пока происходит проверка предиката, время пробуждения проходит, а сам предикат оказывается ложным. Получается wait продолжит работать, но время будет отсчитываться заново?
Короче, очень странно это всё работает. Надеюсь на ваши ответы, потому что не хочу, чтобы люди умирали.
Не может в принципе или конкретно в этом примере? Если в этом примере, то почему?
То есть не совсем верно.
atomic это и memory barrier и compiler barrier. В данном случае актуально второе.
rbegin rend
Пытаюсь сейчас вкатиться. На связь вышло несколько компаний (многие сами), хотя опыта в программировании не было в принципе. Жду результаты тестовых заданий.
ДС, ДС2? Опыта не было, ты имеешь ввиду коммерческой разработки? Что ты там в резюме написал, что аж сами на тебя вышли?
>Насколько я понимаю, это неправильно, потому что компилятор может переупорядочить команды и получится
Нет, как раз относительно атомиков компилятор не имеет право переставлять. С этой точки зрения всё нормально. Здесь неправильность в том, что conditional_variable заточен на работу с мьютексом, поэтому условие (собственно condition, переменная exit) должно изменяться только под мьютекстом, иначе ты сильно огребёшь.
Как работает wait в кондваре
>захватывается мьютекс
>проверяется условие
>если true, идём дальше
>если false, атомарно разлочить мьютекс и заснуть до вызова notify/таймаута
Атомарность на последнем шаге нужна, чтобы не было пропущенных notify вида "разлочили мьютекс, какой-то другой тред вызвал notify но мы его пропустили, заснули".
В твоём случае похожий кейс: ты можешь потерять notify, если произойдёт следующая последовательность событий:
>Тред 1: захватывается мьютекс
>Тред 1: проверяется условие -> exit == false
Тред 1 ВНЕЗАПНО прерывается
>Тред 2: exit=true
>Тред 2: cv.notify_one();
>Тред 1: разлочивается мьютекс и тред засыпает (уже навечно)
Так что мьютекс обязателен в обоих потоках.
tl;dr std::atomic здесь не нужен, просто используй схему из https://en.cppreference.com/w/cpp/thread/condition_variable, она железобетонна.
>Не совсем понимаю, как работает счётчик времени в wait
Нет, запоминается время t="сейчас + 10 секунд" и поток блокируется либо до notify, либо до времени t. Никаких сбросов нет даже при ложных пробуждениях. Возьми и почитай исходники wait, wait_for и остальных, там они довольно простые. Если интересно, как это внутри ОС работает, почитай про системный вызов futex.
>Не получится ли, что из-за ложного пробуждения поток будет стоять 20 секунд, а не 10?
Нет. Но нужно помнить, что поток будит планировщик ОС. А он разбудит не ровно через 10 секунд, а по крайней мере через 10 секунд. То есть поток может проснуться через 10 секунд 2 миллисекунды, 10 секунд 15 миллисекунд.
>Может ли поток проспать пробуждение
См пункт 1 в моём посту. Если всё правильно делаешь - никогда не проспит.
>Насколько я понимаю, это неправильно, потому что компилятор может переупорядочить команды и получится
Нет, как раз относительно атомиков компилятор не имеет право переставлять. С этой точки зрения всё нормально. Здесь неправильность в том, что conditional_variable заточен на работу с мьютексом, поэтому условие (собственно condition, переменная exit) должно изменяться только под мьютекстом, иначе ты сильно огребёшь.
Как работает wait в кондваре
>захватывается мьютекс
>проверяется условие
>если true, идём дальше
>если false, атомарно разлочить мьютекс и заснуть до вызова notify/таймаута
Атомарность на последнем шаге нужна, чтобы не было пропущенных notify вида "разлочили мьютекс, какой-то другой тред вызвал notify но мы его пропустили, заснули".
В твоём случае похожий кейс: ты можешь потерять notify, если произойдёт следующая последовательность событий:
>Тред 1: захватывается мьютекс
>Тред 1: проверяется условие -> exit == false
Тред 1 ВНЕЗАПНО прерывается
>Тред 2: exit=true
>Тред 2: cv.notify_one();
>Тред 1: разлочивается мьютекс и тред засыпает (уже навечно)
Так что мьютекс обязателен в обоих потоках.
tl;dr std::atomic здесь не нужен, просто используй схему из https://en.cppreference.com/w/cpp/thread/condition_variable, она железобетонна.
>Не совсем понимаю, как работает счётчик времени в wait
Нет, запоминается время t="сейчас + 10 секунд" и поток блокируется либо до notify, либо до времени t. Никаких сбросов нет даже при ложных пробуждениях. Возьми и почитай исходники wait, wait_for и остальных, там они довольно простые. Если интересно, как это внутри ОС работает, почитай про системный вызов futex.
>Не получится ли, что из-за ложного пробуждения поток будет стоять 20 секунд, а не 10?
Нет. Но нужно помнить, что поток будит планировщик ОС. А он разбудит не ровно через 10 секунд, а по крайней мере через 10 секунд. То есть поток может проснуться через 10 секунд 2 миллисекунды, 10 секунд 15 миллисекунд.
>Может ли поток проспать пробуждение
См пункт 1 в моём посту. Если всё правильно делаешь - никогда не проспит.
>ДС, ДС2?
Нет, но миллионник.
>Опыта не было, ты имеешь ввиду коммерческой разработки?
Ну да, выразился плохо. Опыта работы не было, а для себя программировал иногда: писал разные программы в стол, алгоритмы сложные реализовывал.
>Что ты там в резюме написал, что аж сами на тебя вышли?
В резюме у меня только образование указано и навыки. В навыках указал всё, с чем умею работать (git, c++ и прочие вещи, которые все разработчики должны знать).
Кинул резюме на hh. Потыкал вакансии привлекательные. За первую неделю на связь вышла только одна компания. Ещё одна компания мне два раза отказала, но потом предложили немного другую вакансию, неплюсовую (собес пройден, оффер уже получен). Через неделю активно начали звонить, писать, но не все из них предлагают плюсовые вакансии (есть предложения на неплохие вакансии от очень крупных компаний типа сбербанка и промышленных, завязанных на оборонку, но в таких иногда указывается про допуск к ГТ).
Проблема в другом. Предложение получить — это одно, но нужно ещё пройти собес и выполнить какое-нибудь тестовое задание, особенно если у тебя никакого опыта неуказано. Короче, жду результаты, но в любом случае оффер у меня уже есть, хотя вакансия неплюсовая, но очень денежная.
>есть предложения на неплохие вакансии от очень крупных компаний
Здесь лучше говорить о приглашениях. Опять неточно выразился.
>>859993
Спасибо большое за ответы.
>>859993
>>Тред 1: захватывается мьютекс
>>Тред 1: проверяется условие -> exit == false
>Тред 1 ВНЕЗАПНО прерывается
>>Тред 2: exit=true
>>Тред 2: cv.notify_one();
>>Тред 1: разлочивается мьютекс и тред засыпает (уже навечно)
Понятно и доступно, спасибо. Тред заснёт навечно, если использовать обычный wait, а если wait_for он же всё равно должен по таймеру проснуться? И ещё я так понял, после выхода из wait мьютекс остаётся заблокированным?
>std::atomic здесь не нужен, просто используй схему
> {
> std::lock_guard<std::mutex> lk(m);
> ready = true;
> std::cout << "main() signals data ready for processing\n";
> }
> cv.notify_one();
Здесь барьером для компилятора служит notify или вложенный контекст {} с мьютексом?
Остальное вроде понял.
Нашёл годную книгу, как я понимаю, от одного из тех, кто как раз разрабатывал boost::thread, а потом std::thread. Очень классно и красиво.
Энтони Уильямс, «C++. Практика многопоточного программирования».
>>859993
Спасибо большое за ответы.
>>859993
>>Тред 1: захватывается мьютекс
>>Тред 1: проверяется условие -> exit == false
>Тред 1 ВНЕЗАПНО прерывается
>>Тред 2: exit=true
>>Тред 2: cv.notify_one();
>>Тред 1: разлочивается мьютекс и тред засыпает (уже навечно)
Понятно и доступно, спасибо. Тред заснёт навечно, если использовать обычный wait, а если wait_for он же всё равно должен по таймеру проснуться? И ещё я так понял, после выхода из wait мьютекс остаётся заблокированным?
>std::atomic здесь не нужен, просто используй схему
> {
> std::lock_guard<std::mutex> lk(m);
> ready = true;
> std::cout << "main() signals data ready for processing\n";
> }
> cv.notify_one();
Здесь барьером для компилятора служит notify или вложенный контекст {} с мьютексом?
Остальное вроде понял.
Нашёл годную книгу, как я понимаю, от одного из тех, кто как раз разрабатывал boost::thread, а потом std::thread. Очень классно и красиво.
Энтони Уильямс, «C++. Практика многопоточного программирования».
Шаблонные функции и декларируются, и имплементируются в хедер файле.
>а если wait_for он же всё равно должен по таймеру проснуться
Да. Но полагаться на это чтобы писать иногда не работающую логику всё равно неправильно, сам понимаешь.
>И ещё я так понял, после выхода из wait мьютекс остаётся заблокированным?
Да. Каждое просыпание внутри wait тред снова захватывает мьютекс. Предикат проверяется под мьютексом, и после выхода мьютекс останется у треда.
>Здесь барьером для компилятора служит notify или вложенный контекст {} с мьютексом?
Не очень понял вопроса, но постараюсь объяснить. Захват/разблокировка мьютекса жёстко накладывают ограничения и для компилятора, и для процессора. Когда следующий тред захватит мьютекс, он должен будет увидеть результат всех операций, совершённых внутри критической секции. То есть если кондвар проснулся вследствие notify_one, он обязан будет увидеть то ready=true.
>Энтони Уильямс, «C++. Практика многопоточного программирования».
Говорят ещё у Таненбаума норм про основы синхронизации тредов. По крайней мере нам давно в универе с него читали лекции. Хотя там было больше про сами алгоритмы и примитивы, без всяких моделей памяти и lock-free и прочего.
>потому что не хочу, чтобы люди умирали.
Не пользуйся тредами. Сделай один луп, в начале которого проверяешь все нужное руками сам. И потом по свитчам часть работы. Сорт оф корутины.
Господин эмбеддедщик знает толк.
>критической секции
Что это? Много раз уже встречал это выражение, но так и не понял.
>Говорят ещё у Таненбаума норм про основы синхронизации тредов.
Тоже гляну, спасибо.
>>860017
Сомневаюсь, что в моём случае такой подход приемлем, но можно подумать, как это организовать. Проблема в том, что каждый тред должен засыпать на разный промежуток времени. С одним лупом пришлось бы выбирать, с какой периодичностью мы теребим условия: 1 мс, 10 мс или 100 мс? Мне кажется, это не очень удобно.
>проблема в том, что
Ещё забыл добавить, что потоков может быть несколько десятков. Думаю, с такими условиями одним лупом не отделаться.
Уже ближе. Лупы крутятся — пупы мутятся. Пожалуй, возьму на вооружение такую методологию разработки.
>потоков может быть несколько десятков.
А ядер у тебя столько есть? Если нет, то не стоит заикаться о заботе о чьих-то жизнях.
>Что это? Много раз уже встречал это выражение, но так и не понял.
Это та область кода, которая требует эксклюзивного доступа только одного треда. По сути всё, что между mutex::lock() и mutex::unlock(). В винде мьютекс, работающий в пределах одного процесса, даже называется CRITICAL_SECTION.
Понял, спасибо. То есть критический контекст — это всегда мьютексы? Например, атомарные или условные переменные сами по себе не создают критической секции при использовании? Или всё-таки создают? Условная переменная, например, создаёт при проверке условия в wait, но не создаёт при использовании notify. Атомарные переменные, наверно, тоже создают, когда к ним обращаются или пишут в них. Правильно? Наверно, атомарные переменные через мьютексы и работают?
>это всегда мьютексы
Мьютексы, спинлоки, семафоры, мониторы, алгоритм Лампорта - что угодно, что позволяет только одному треду находиться в определённой секции кода.
https://en.wikipedia.org/wiki/Critical_section
>атомарные или условные переменные сами по себе не создают критической секции при использовании
Нет, не создают. В conditional_variable это происходит за счёт мьютекса, который ты ему передаёшь.
>Атомарные переменные, наверно, тоже создают, когда к ним обращаются или пишут в них
И да и нет. Несколько тредов одновременно могут выполнять одну и ту же операцию над атомарной переменной. Но по сути результат получается, как будто каждый тред по очереди выполнял операцию.
>атомарные переменные через мьютексы и работают
Нет, это примитивы процессора. Хотя в теории такого же эффекта можно достичь, обернув все операции над атомарной переменной в мьютекс.
Спасибо тебе, анон. Теперь гораздо понятнее, с чем я имею дело. Пойду читать про многопоточное проектирование.
Хотя один вопрос ещё имеется. Рассчитана ли стандартная либа на использование в многопотоке? Например, методы у контейнеров, объекты (статические?) по типу std::cin/cout или алгоритмы из <algorithm>?
Ничего не понял. Ты своё приложение запускаешь из консоли или тупо отправляешь текст на консоль?
> Ты своё приложение запускаешь из консоли
Это. Но т.к. у меня оконная подсистема, надо вручную переключать вывод в консоль. Я переключил как нагуглил, но он криво пишет в консоль. Как сделать чтоб было как в обычном консольном приложении?
https://stackoverflow.com/questions/191842/how-do-i-get-console-output-in-c-with-a-windows-program
Перепробовал отсюда всё и ничего не работает нормально.
>Рассчитана ли стандартная либа на использование в многопотоке?
Нет. И это сделано специально.
Я и ответил. Это неопределенное поведение. Ответ может быть любым, например форматирование диска Цэ. Откуда вы лезете?
Какое из двух говен менее воняет?
> C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin\Microsoft.Common.CurrentVersion.targets(2390,5): error MSB3774: Could not find SDK "Microsoft.VCLibs, Version=14.0".
Как это говно чинить? Пробовал уже переустанавливать студию - не помогает. Что он хочет? Установлено всё что можно, но он просит зачем-то 14.0. Это вообще что такое, блять? В параметрах проекта указан вообще другой SDK.
Любой пробовал из кучи доступных, даже 14.00 от VS 2015. Он всегда просит эту хуйню 14.0.
Установить gcc, очевидно.
Возможно потому, что при ++h она становиться единицей. Затем h++ становиться двойкой, и после происходит сложение.
Лучше бы помог, я всё ещё пердолюсь. Всё началось после установки превью-версии студии, естественно удалил нахуй сразу её. Даже пустой проект не собирается и требует 14.0. Сейчас второй раз начисто всё удалил, почистил все папки вилкой и поставил заново студию - нихуя не помогло. Если делаю ретаргет, то он пишет типа после этого нельзя будет собрать проект в 2015 студии, для сборки под ней выберите в параметрах таргет 14.0. Но у меня нет 2015 студии, а установка 14.0 ничего не даёт. Какого хуя, блять? Алло, индусы!
>>860496
Чистый тоже не работает. Вообще нихуя не работает.
А ещё теперь постоянно такое ещё пишет:
> error : Designtime build failed for project 'C:\Users\Admin\source\repos\App10\App10\App10.vcxproj' configuration 'Debug|Win32'. IntelliSense might be unavailable.
> Set environment variable TRACEDESIGNTIME = true and restart Visual Studio to investigate.
Он мне тут предлагает заниматься расследованием почему эта хуита не работает из коробки и не собирает пустой проект!
Джосатиса, Мейерса
Разве что в геймдев идти, который в России в парочке компаний и в десятке инди студий с копеечной зп?
Не в деньгах счастье
есть и те кому много платят, тут в треде когда то был кун с нвидии, получают там ахуеть
помогите бля объяснить как это хуйня выполняется в цикле
#include <iostream>
#include <conio.h>
#include <math.h>
using namespace std;
int main()
{
float eps = 0.001, s1, s2, p;
int k = 0;
s1 = 1;
s2 = 0;
p = s1;
while (fabs(4 s2 - 4 s1) > eps)
{
k++;
s2 = s1;
s1 = (pow(-1, k) / (2 k + 1));
p += s1;
}
cout << "PI=" << round((4p)*1000) / 1000 << endl;
return 0;
}
Это копия, сохраненная 30 марта 2021 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.