Это копия, сохраненная 31 декабря 2020 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
⚹ https://github.com/sosachbot/cppthreadhat/wiki
Ответы на вопросы:
⚹ https://en.cppreference.com/w/
⚹ https://www.cplusplus.com/reference/
Звездочки для указателей:
⚹★☆☀⚛✱✬⛧ ✭ ✮ ✯ ✰ ✡⛥ ⋆ ✢ ✣ ✤ ✥ ❋ ✦ ✧ ✩ ✪ ✫ ★⚹
Прошлый тред: https://2ch.hk/pr/res/1719888.html (М)
Смешно.
Чтобы через пару десятков лет любой язык был подмножеством C++.
Пайплайны, ленивые вычисления, генераторы, вот это всё.
int sum = accumulate(views::ints(1) | views::transform([](int i){return i*i;}) | views::take(10), 0);
Я правильно понимаю, что все кроме модулей добавляется просто созданием новой библиотеки, а сам язык фактически не изменяется?
А что, если появление модулей решит проблему с подключением либ/управлением зависимостями, и легаси cmake наконец-то сдохнет?
>C++20
Нахуя так усложнять язык? ещё stl нормально использовать не научился, а они уже пару новых парадигм успели придумать. Нахуя блять это всё делается, на каком-то тырпрайзе реально не хватало этих ranges и constexpr контейнеров, чтоб всё работало?
cmake - это не пакетный менеджер. В cmake ты говоришь, как и что нужно для сборки твоего проекта.
Ну и на том спасибо.
Не могу, он тормозит и не стыкуется с легаси говном.
А вот новые кресты позволят макакировать быстрее и проще. Но это не точно.
Лучше бы разбили С++ на несколько подязыков, отдельный для каждой "парадигмы", и для каждого описали свой стандард, из которого были бы выброшены все элементы, не соответствущие этой "парадигме" конкретного подязыка. Логично, что многие подходы ranges так или иначе являются переосмыслением тех же stl итераторов. В проекте, в котором повсеместно используюется один подход, другой бы не применялся. Итого можно было бы получить подязыки С++STL, C++Functional, C++Ranges и т. д. И все они были бы совместимы друг с другом на уровне отдельных библиотек.
Это блять дрочка вприсядку.
Всё что сложнее бесконечной последовательности факториалов суммы чисел в массиве в такой записи вырождается в непредставимый пиздец, который сосет у for(int i...) по скорости написания и читаемости.
То есть ты утверждаешь, что программист обязан писать весь код исключительно в одной парадигме?
Тут от обеспечения совместимости с прошлым-то стандартом жопы скрипят, а ты хочешь еще и диалектов наплодить.
В рамках одного проекта - да. Так же как и должен придерживаться единого кодинг стайла
Все это делается на итераторах, ranges это буквально сахарок. Я не понимаю какие идиоты пропустили этот оверинжинирд бред в стандарт.
В хоть сколько-нибудь больших проектх это не работает, как бы красиво и идеалистично это ни звучало. К тому же, кодинг стайл ещё не значит конкретная парадигма.
А итераторы делаются на указателях, так что итераторы - это тоже сахарок и нинужна. Да и вообще, нахуй кресты, ведь сишка тоже тьюринг-полная.
Чистая правда
Вербозно((
Я сделал правильный выбор?
Да, и готов с этим поспорить.
> Что почитать чтобы реализовать Buddy и SLAB аллокаторы.
Совет номер один от гуру цпп да и в принципе адекватных людей - использовать кастомные аллокаторы только по результатам профилирования и только если это bottleneck
>Есть какие-нибудь проблемы именно по части содержания?
Именно эту книгу я не читал, а читал его учебник "введение в профессию". По части содержания - всё очень-очень неплохо. Проблема только с тем как он хуево пишет. Натравить бы на эти книги хорошего редактора с писательским опытом - цены бы им не было.
Всё неконстантное, не связанное с объектом + mutable члены класса
Тащемта берешь и без задней мысли передаёшь. Или пишешь шаблон
template<class T, size_t n>
void foo(std::array<T, n> const &arr){}
По скорости не уступает линку, да.
>>728337
Есть же уже либа с более адекватным синтаксисом https://github.com/mrange/cpplinq (правда ее уже никто не обновляет). Почему они решили сделать какую-то нечитабельную херню вместо этого?
Разобрался
В большинстве случаев проще свой контейнер написать под конкретную задачу, чем прикручивать кастомный аллокатор к библиотечному контейнеру.
Работать то оно будет, но каждый раз писать аргументы шаблона заебывает. Вопрос почему второй вариант работает если это просто частный случай первого?
Платиновый вопрос
> что такое линковка
Склеивание скомпилированных единиц трансляции (cpp файлов) в единый бинарник
> почему при смене abi все пойдет по пизде
Потому какой-нибудь бинарник рассчитывает, что в твоём классе будет два поля, но после поломки ABI там осталось одно. Повезёт, если не соберётся. Если не повезёт, то оно соберётся и отстрелит тебе хвост по самое ебало
ABI это как раз про линковку. Системные вызовы все на сях, и там ABI слава аллаху неизменен.
А мне нравятся все его шутеечки охуенные.
Мне чтобы сертификатик получить надо его бахнуть. Да и вроде на собесах просят реализовать, в качестве тестового задания.
> Мне чтобы сертификатик получить надо его бахнуть.
Про туалетную бумагу слышал, не? Никому твои всратые сертификаты не нужны, повезёт, если прогеры твоё резюме прочитают за пять минут до собеса.
>Да и вроде на собесах просят реализовать, в качестве тестового задания.
Я так понимаю, эту страшилку тебе на тех же говнокурсах рассказали?
Не на киберфоруме с чуваками общался. На кст и собес был на мидла-байтоёба.
>Про туалетную бумагу слышал
Слышал, я ей жопу вытираю
>Никому твои всратые сертификаты не нужны
Ты скозал? Если бы они не были нужны, то их бы и не было, а они есть.
Как минимум, сертификат показывает, что ты действительно пытался чего-то достичь, а не просто балобол.
>если прогеры твоё резюме прочитают за пять минут до собеса
Шиз, а как они ему будут вопросы задавать ты подумал? Им не выгодно так на отъебись делать собес, потому что они блять к себе на работу принимают, чтобы он деньги приносил, смекаешь? Я тебя может удивлю, но в нормальной конторе делается несколько печатных копий твоего резюме для каждого собеседующего.
>страшилку тебе на тех же говнокурсах рассказали?
Ну хоть тут ты не обосрался, хотя опять же - что будет в качетсве тестового даже сам Аллах не знает. Всё, что требуется от кандитата так это соответствовать собственному резюме.
>Я тебя может удивлю, но в нормальной конторе делается несколько печатных копий твоего резюме для каждого собеседующего.
Всем плевать на твое резюме, у собеседующих есть набор стандартных вопросов и задач которые они задают, после собеседования они отправляют фидбэк и забывают о тебе.
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<> distrib(1, 6);
Посмотри что rd() возвращает. Если там одное и тоже то ищи друкгой компилятор. Ну или придумай что-то свое - может система может сгенерировать достаточно слуыайное число, или там инициализируй хешом от текущего времени.
> Двач, с каждым запуском программы генерируются одни и те-же числа, подскажите как исправить.
Блять, так там и должны генерироваться одни и те же числа. Ты хоть почитай про это.
Суть функции: передаю корневой каталог в котором надо найти все файлы (включая файлы в под-директориях), извлечь из них информацию и засунуть в структуру, а структуру в вектор запушить (который на скрине пока не используется).
И да, если убрать этот блок else, то программа корректно выведет все файлы и директории (если выполнить cout << fullPath). При этом сам блок else, как я уже сказал, работает правильно.
Пройдись дебаггером да посмотри, что прога делает и где падает. Алсо, для дебажного вывода лучше делать флаш потока, иначе перед крашем может просто случайно не вывести какую-нибудь строку. Например, можно вместо "\n" делать std::endl.
Ты осознаешь почему ругаются на си с классами?
for(auto& p: std::filesystem::recursive_directory_iterator(dirname))
std::cout << p.path() << ' ' << p.file_size() << '\n';
У меня нет c++17 в gcc 8.1.0.
>>730792
Я пробовал сигналами ловить его (SIGSEGV). Не ловит, значит это не он.
>>730809
>>730803
Если бы этот дебаггер еще работал сам нормально... Например, я сейчас смотрю как заполняются поля структур и вижу, что половина почему-то вообще не отображается после записи, хотя, если сделать cout этого поля, то все нормально. Хз, проблема ли это плагина для vscode, либо самого отладчика gdb.
Попробуй проект пересобрать заново. Такое бывает, когда какой-то объектный файл не обновился и срет в память. Если не поможет - смотри отладчиком или valgrind/drMemory.
При том, что я и просто приведение типа делал на [0], без выделения памяти все равно не работало.
>перец
Чем на пикабу/хабре не сиделось, залетный?
Это отменяет факт того, что под строку надо выделять память? Нет. Вот и все. Какие еще притензии к строкам? Из контекста не выдирай.
Как вообще происходит возвращение переменной в конце выполнения функции, если этой переменной если она автоматическая уже не должно существовать?
Какой же ты тугой.
Функция принимает на вход си-строку, там по дефолту нужно выделять память.
То, что методы string и методы, которые принимают ее на вход, сами это делают тут не при чем.
И нехуй потом жаловаться, что при использовании string в методе, который принимает char*, ты обсираешься на выделении памяти.
Посмотри дизассемблер. В зависимости от соглашения о вызовах переменная может быть на на стеке вызванной функции, который зачистит уже вызывающая после возврата (предварительно переложив результат вызванной в какую-то свою переменную), а может передаваться через регистр и тогда стирание фрейма вызванной её не затронет
А ссылка это тот же указатель внутрях, только с ограничениями на уровне языка - нельзя разыменовывать, не может быть нулл
Тупой ты, потому что не знаешь о перегрузках явного преобразования типов. А теперь съеби уже на свою голубятню на хабр, залетыш.
Какой же ты дурень.
Когда ты передаешь куда-то внутренности string, они не обязаны делать выделять необходимую память под операцию.
Ты пытаешься воткнуть квадрат в круглое отверстие и пиздишь, будто квадрат виноват, а не ты тупой.
>Какой же ты
>Какой же ты
Какой же ты жалкий. Нахуй ты свою пасть разеваешь вообще, уебище? Если до тебя десятый раз суть мысли не доходит, иди пробздись что ли, я хз. Ты как долбаеб одно и тоже повторяешь, сука. Съеби, реально. Тут для тебя места точно нет. Такие, как ты должны сидеть в своем углу и дрочить друг-другу на своих законных местах. Квадраты у него в отверстия пихают, долбаеб, блядь. Хррртьфу в ебало тебе, чмо пикабушное.
Соглашение о вызовах существует в рамках интерфейсов библиотек. Внутри компилятор не обязан его соблюдать и имеет право срать лапшу как хочет.
Уже понял, я забыл ссылку
Bicycle.
auto mmin (std::vector<std::pair<int, bool>> &a) {
return std::min_element(a.begin(), a.end(), [](auto i, auto s){return i < s && i.second == true; });
}
Ебать тебя порвало-то.
Так что за библиотека?
Это именно внешняя C/++-либа, никак не связанная с Qt?
>>731249
У Qt и так есть модуль для работы с SQL-базами, в т.ч. SQLite.
https://doc.qt.io/qt-5/qsqldatabase.html
Просто нагугли примеры. https://habr.com/ru/post/128836/
мимокрок, последний раз писал на Qt/С++ много лет назад в шараге
>У Qt и так есть модуль для работы с SQL-базами, в т.ч. SQLite.
Мне похуй что там есть или нет у Qt, обычную библиотеку как подключить
В общем тебе надо создать поток, а в нем сделать цикл. При нажатии кнопки цикл будешь завершать итерацию и останавливать его, а при повторном нажатии вновь запускать.
Удачи братан
Прям в цикле нельзя проверить, нажата кнопка или нет?
Толсто.
Потому-что ни один вменямый человек не будет рисковать писать проекты на хаскелле
Ананасы, выполнил такое задание, но оно неверно выполнено. Что не так, кроме того, что я немного поменял оглавление функции?
Она не оптимизирована по количеству обращений к памяти, например.
Ты сначала идёшь по всей строке до конца, а потом идёшь обратно по пробелам. Это O(n+m), где m - количество пробелов. Если вся огромная входная строка состоит из пробелов, то ты дважды пройдёшься по огромной строке.
Можно идти по строке и при встрече с пробелом сохранять его адрес и обнулять его, если встретил непробельный символ. Это O(n). Потом скопировать в новую строку всё от начала до полученного указателя, если он не нулевой. Ну и не забыть про налл терминейшн.
Конкретно ошибок в коде не искал.
Понял. Или запоминать адрес непробельного символа, если после него пробел и не менять его до тех пор, пока не найдётся следующий непробельный и всё заново.
Функция возвращает void, поэтому думаю, что по заданию нужно просто занулить символ, следующий за последним не-пробелом.
Если там по аналогии с бустом, то должны быть небросающие перегрузки, принимающие error_code.
Блядь. Шли нахуй людей с такими заданиями. Если они не могут четко сформулировать задачу, значит они идут нахуй.
Лол, меня уже сегодня послали с таким решения, сюда пришёл узнать что не так с кодом, нуууу, теперь узнал, хотя тоже недоумевал с постановки задачи.
Хуя порвался
Это очевидно.
>совершенно не разбирающиеся даже в сишных строках
Чем отличается сишная строка от строки в С++?
Как авторы этих туториалов собираются выигрывать это место? Каждый раз делать свои ноды и паковать там битики, потому что семь лишних бит это важно? Unsigned char, да даже просто char, для высоты АВЛ хватит с головой, потому что высота дерева это logN, и для высоты 30 должно быть миллиард нод.
GCC цвет далеко-далеко не в одном бите хранит. (строка 00090)
https://gcc.gnu.org/onlinedocs/libstdc++/libstdc++-html-USERS-4.1/stl__tree_8h-source.html
Что "скорость"? Я разобрался, в чём преимущество. Да, в RB будет меньше вращений -> должно местами быстрее работать.
Я про том, что в туториалах и на википедии отдельным пунктом упоминают, что RB дерево будет занимать меньше места, чем АВЛ, но по факту так не делают, а если так делать, то это скорее всего убьёт всё преимущество по скорости.
Скорость в наше время зависит от ублажения кеша, а не от битового кулхацкинга (им-то как раз наоборот можно перфоманс заткнуть, забив пайплайны и пролюбившись с кешем.)
Если str способна принять rvalue, то можно же "суммирование" внутрь str засунуть, нет?
Да, так ещё короче.
Инфа же всё равно в каком нибудь char хранится, который побитно обрабатываеся, всё равно надо по байту выделять, наверное.
>>733492
И это хорошо, пердолинг никогда и ни к чему хорошему не приводит. Вчера поинтересовался хаскелем и понял, что лучше пожертвовать памятью с одинаковыми данными для каждого потока в программе, чем выгибаться от ментального напряжения в попытке сэкономить пару мегов инфы. Но хаскель по моему слишком куда-то далеко пошёл в своей идее функций.
>Чем отличается сишная строка от строки в С++?
short string optimisation, крестовые строки не всегда выделяют память из кучи
кро
>short string optimisation
Когда это бывает нужно? В нынешнее время экономить на памяти плохой тон, исключение разумеется всякие мелкие йобы.
Это стандартная библиотечная фича, которая не знает, на чем ты там собрался запускать свою программу.
Плюс при этом меньше indirection, значит выше скорость.
Особенно когда у тебя может быть несколько тысяч этих строк только с локализациями, ага, вообще плохой тон. Что ты несёшь, мартышка?
Ты такой умный! Покажи свои работы!
Если ты, анон, написал "экономить на памяти плохой тон", а указание на то, что это экономия на обращениях в кучу, называешь капитанством, то ты ультрадушный хуй.
Добра
>всё равно надо по байту выделять
Или просто протеггировать указатель. Не тратить же зря нижние биты.
Это написал какой-то залетный питухонщик, душный кэп.
Как мне их закинуть в директорию и от туда подключать (к примеру #include "3rd_party/tabulate/table.hpp")? Использую cmake.
Просто эти заголовки друг друга подключают по пути #include <tabulate/*.hpp>
Подскажите
CXXFLAGS=-I/путь/перед/tabulate?
В C++50 можно будет
# include <c_sharp>
using System;
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
}
}
Зачем? Писать приходится на обоих, и я чот не понимаю зачем в крестах больше сахара по-твоему.
Благодарю
int i = x+1; (x индекс твоего крестика )
int size = vec.size();
while(i!=x){
//обрабатывай элементы
i+=1;
i=i%size;
}
Типо такого я думаю. Че надо сам подправишь
Хотя мне кажется брать каждый раз остаток слишком дорого. Лучше действительно 2 цикла.
Или этого можно добиться только написав делающий это вручную makefile?
Так же вопрос насчёт web framework'ов? Можно ли на C++ нормальный CRUD написать как на джувке?
Если всё хуйня, то как бы поясните чё вы сами-то кроме лаб на крестах пишите? Вы не подумайте, я не стебусь, я просто жабист и вот вкатываюсь.
> есть ли на C++ хуйня типа maven или npm?
Vcpkg, conan.
> Или этого можно добиться только написав делающий это вручную makefile?
Вопреки здравому смыслу, здесь принято делать так. Или через cmake.
> Так же вопрос насчёт web framework'ов? Можно ли на C++ нормальный CRUD написать как на джувке?
Нормальный - нет . Хоть какой-то - да. Есть несколько либ, их никто не использует, и со спрингом в плане крудошлёпства они не сравнятся.
> Если всё хуйня, то как бы поясните чё вы сами-то кроме лаб на крестах пишите?
Открой hh, вбей кресты и почитай, что пишут, чем придётся заниматься. Что угодно, кроме веба.
Спасибо!
> Vcpkg, conan.
А это кто-то юзает, или сделано для галочки?
> Вопреки здравому смыслу, здесь принято делать так. Или через cmake.
Божественный cmake
> Открой hh, вбей кресты и почитай
https://hh.ru/vacancy/37314205
Вот увидел. Как они пишут бэк на крестиках? Или на C++ только МИКРОСЕРВИСЫ и КОРЫ делают, а запросы резолвят чем-то ещё?
> в плане крудошлёпства они не сравнятся.
А почему? Язык бы мог джаву порвать...
> или сделано для галочки?
Да, но кто-то использует.
Там, похоже, не классический бекенд, отдающий html, а очереди и вебсокеты. Этим заниматься на плюсах не так больно.
> А почему? Язык бы мог джаву порвать...
Небезопасный и сложноват. Конкретно джаве конкуренты, наверное, только шарп и пщ. Бизнесу нужна проверенная временем и устойчивая к ошибкам кодера технология, которую может изучить куча разрабов, чтобы брать количеством.
юзай индексирование по модулю
в плюсах не сильно шарю, но чёт подобное
int el_idx = arr.index(your_element);
for(int i = 0; i < len(arr); i++) {
arr[(i + el_idx) % len(arr)] ...
}
uint8_t, но я пробовал приводить вручную к size_t, не помогло
>Там, похоже, не классический бекенд, отдающий html, а очереди и вебсокеты. Этим заниматься на плюсах не так больно.
А насколько рилтайм аппликации на вебносках лучше делать на C++, чем на каком-нибудь node или той же java?
Буст к производительности будет?
> Небезопасный
Ну хуй знает, завезли же smart-ptr. Или не безопасный это больше про еблю с потоками? Ну это да, есть немного. Сложнее будет. А так язык как язык. Не знаю чем прям он такой сложный. По-моему весь спринговысер разбирать не легче.
Вот бы только ещё в лямбду индекс передавать.
> А насколько рилтайм аппликации на вебносках лучше делать на C++, чем на каком-нибудь node или той же java? Буст к производительности будет?
Имеет смысл, только если будут интенсивные расчёты/вычисления. Судя по словам "реалтайм" и "крутая математика", там так оно и есть. В остальном толку мало, в обычном круде самое долгое - ждать ответ на запрос к базе, и стльного буста не было бы, что джава, что ассемблер.
> smart-ptr
Не универсальны, потому что куча либ и старого кода работает с сырыми указателями. Да и без этого хватает способов выстрелить себе в ногу, тот же move.
> весь спринговысер разбирать не легче
В спринге ты хоть разбираешь только то, что нужно. Учишь десяток аннотаций, ставишь их в правильных местах - и вот тебе готовое приложение. В плюсах тебе одни только шаблоны будут сниться в кошмарах, что уж UB.
Бля, я даун, я понял. Из-за того, что uint8_t это по сути unsigned char, то оператор вывода выводит data, как символ, а там как раз '1', а это 49 в ascii. Короче, попал в свою же ловушку жокира.
>крутая математика
А я этого не говорил :^)
> реалтайм
Под риалтаймом я как раз имел в виду не крудец.
> потому что куча либ и старого кода работает с сырыми указателями
Так они же сами должны уже мемори менеджить? Или я чего-то не ппонимаю.
> В плюсах тебе одни только шаблоны будут сниться в кошмарах
Ну темплейты это слишком сильное колдунство иногда, это да.
> не говорил
Там в вакансии упоминается, имею в виду.
> Так они же сами должны уже мемори менеджить?
Менеджат, да. Но в местах вызова можно проебаться. Это всё равно нужно постоянно держать в голове вместо джавовского "я создал объект, передал куда-то ссылки, а дальше пусть GC разбирается".
Тогда лучше заставить сделать отдельные *int8_t, а не алиас на char.
Быть внимательным. Я же смотрел на вывод, видел там 1 и не понимал нихуя, а по факту это был символ '1' со значением 49.
Одновременно? Нет. Храни список значений в каком-нибудь векторе.
Флаги, как деды завещали.
enum {
A = 1,
B = 2,
C = 4,
D = 8,
};
...
int v = A | C | D;
...
if (v & A) { ... }
if (v & D) { ... }
Не, а если я хочу вывести восьмибитовый инт как число? Кастовать к инту? А это не затратно?
Нет
> Да, но кто-то использует.
А ты как собираешь зависимости? Неужели проще вручную пердолить, а не vcpkg install mylib?
stringstream выглядит как говно, особенно если формат строки сложный. Склеивать строки c std::to_string ещё более неудобно. Нет какого-то стандартного sprintf, чтобы вывод был сразу в std::string без ёбли с буферами?
https://en.cppreference.com/w/cpp/utility/format/format который уже ДОЛЖЕН быть, но вроде пока нет в стандартной либе. Поэтому приходится вручную подключать https://github.com/fmtlib/fmt
Напиши свой враппер вокруг sprintf который возвращает std::string и используй атрибуты компилятора для валидации строки формата.
На линуксе обычно хватает make-файлов или вообще build.sh, там системный менеджер пакетов сам тащит то, что нужно.
На винде cmake, архивы с либами качаю вручную. Неудобно, но это делается один раз.
>На линуксе обычно хватает make-файлов или вообще build.sh, там системный менеджер пакетов сам тащит то, что нужно.
Детектор говноеда красноглазого
Я знаю об этом. Это же draft
В явном виде пишется только в dependent коде из-за ебанутых правил инстанцирования шаблонов. А так - указатель как указатель
>от 210 000 до 260 000
И тут я понял, что по меркам ДС это не так много, ибо квартира будет стоить рядом все 15 000 000, и даже если ужаться и отдавать по 200 000, то потребуется шесть лет и три месяца, а гарантии такой ЗП как и существования конторы нет.
Можно начать с малого, устроиться на подобную работу, через несколько лет питания исключительно гречкой купить за 5 лямов где-нибудь за МКАДом, чтобы добираться до работы за 2 часа. Затем поднакопить ещё сколько-то, взять новую и т.д, пока внезапно не обнаружишь, что тебе уже 50 лет, здоровье посажено, тяночки нет и никогда не было.
Алсо, что скажете о clion? Думаю, может туда перейти... Но мне нравились все эти редакторы простенькие типа sublime text, vscode, только постоянно в них проблемы какие-то с удобством использования gui дебага у меня. VS studio вообще не нравится, тяжелая, открывается годами. Если clion окажется таким же тяжеловесом медленным, то скорее всего продолжу жрать кактус.
Вообще не понимаю людей, топящих за vim/emacs. Неужели там действительно все так удобно, включая дебаг? А автодополнение там есть вообще?
Т.е.
Содержимое файла: 01 02 03 04
1 вариант:
file.read((char*)&floatVar, sizeof(floatVar)); -> floatVar = 1.53999e-36 (ПРАВИЛЬНО)
2 вариант:
file.read((char)&charArr[0], 4);
intVar = ((((((((0x00 << 8) | charArr[3]) << 8) | charArr[2]) << 8) | charArr[1]) << 8) | charArr[0]);
floatVar = (float)intVar; -> floatVar = 1.69091e+07 (ХУЙНЯ)
https://en.cppreference.com/w/cpp/memory/new/operator_new
Там ниже идёт operator new(std::size_t sz, bool b) - что это за bool, откуда он берётся? Там написано что placement-версия должна иметь 2 или более параметров, но если я меняю на int - то оно не компилируется. С bool всё работает, но не хотелось бы писать однотипный ctrl+c/ctrl+v оператор во всех классах.
Как по мне только усложняет код. Буквально на днях написал похожий интерфейс для аналогичный фичи на сях. Зачем мне в С++ такое? Даунгрейд ас ис.
Формально, игоры это такой софт реалтайм. что не мешает писать их на джаве
Нужен как минимум аллокатор с гарантированым временем худшего случая. Либо по возможности обходиться без динамической памяти.
Игоры это не реалтайм. Если комп не успевает выдавать много фпс, то он просто выдаёт меньше, вот и всё.
накопал
учебник П.А.Орленко, Евдокимов П.В. - C++ на примерах. Практика, практика и только практика [2019]
нормально епта?
Эээ, ну и что из этого следует? Риалтайм — это про константное время выполнения, а не про твои маняфантазии. Если на одной железке фпс в одной сцене одинаковый — то это уже риалтайм.
>>735079
Если этот софт запустить на приборах 15+ летней давности — он перестанет быть риалтаймом из-за возросшего времени выполнения?
Пример отсутствия риалтайма — это разработчики компиляторов и иде, уже середина 2020, а модулей как не было так и нет.
1) это когда ОС (если она есть) даёт гарантию, что ты точно получишь сколько-то процессорного времени (и других ресурсов). Если есть многозадачность, то в правилах переключения между задачами нет никакого рандома и эвристики, всё документировано.
2) и ещё это когда ты сам используешь алгоритмы, которые занимают предсказуемое время, и не имеют никаких "скрытых" просадок. Под такими просадками я имею ввиду всякие аллокаторы и прочие разновидности функций типа ДайЧтоНибудь(), которые могут дать быстро, а могут не найти чего-то и начать грузить, искать где-то ещё, и т.д.
>user defined параметр
Какой у него смысл? Я нигде его после же не указываю, верно?
Если это просто сигнатура для компилятора как с префиксным и постфиксным ++, то по идее там бы явно было написано про bool. Причём при наличии обоих вариантов оно выбирает в пользу void✱ (его я случайно подобрал).
Есть софт риалтайм и хард риалтам.
Хард риалтайм - это когда точно известно, что операции выполняются за столько-то времени и не больше(меньше), и кушают столько то ресурсов и не больше(меньше). Какая-то погрешность может быть заложена, но она обычно весьма мала и тоже точно определена. Обычно хард риалтайм на заводском оборудовании, в военке, авиации, мед оборудовании и так далее.
Софт риалтайм это когда тоже что-то выполняется в реальном времени, но нет требований к высокой точности, например, внезапный проход GC не приведёт к аварии/смерти/прочим фейлам, а просто юзер увидит лаг, или даже не увидит.
> Какой у него смысл? Я нигде его после же не указываю, верно?
У него смысл быть user defined параметром. Ты эти параметры явно указываешь в скобках: new(myparam)
> Причём при наличии обоих вариантов оно выбирает в пользу void✱ (его я случайно подобрал).
Ты в свой placement new передаёшь указатель, ясное дело, что void ★ лучшая альтернатива bool. В третьем случае у тебя не собирается, потому что указатель к инту так просто не приведёшь.
Можешь объяснить почему ub без просмотра видео на час?
Фигня с выравниванием, потому что компилятор пытыется считать число как выровненное, но никаких гарантий этого у него нет?
У меня не получается сломать: https://ideone.com/ika5RK
>>735012
Можешь более полный код показать? Я создал файл с одним флоатом, и у меня всё корректно считывает даже по байтам. И если в начале дописать какие-то байты, то тоже нормально работает.
Самый страшный undefined behavior - это тот, который работает так, как ты думаешь.
Если этот "UB" работает везде как и написано, то получается, что это и не UB вовсе...
Бля будешь, что раз в этом тривиальном случае так совпало, что работает, то никогда в более сложном кейсе не выстрелит?
UB это когда в стандарте не прописано,не?
Все компиляторы могут сделать его результат одинаковым, но можно написать компилятор у которого результат будет другой и компилятор будет прав а погромист не прав, не? мимо проходил
Да. Более того, существующие компиляторы могут изменить своё поведение в будущем, и те, кто думал, что можно хоть иногда полагаться на UB, пососут больших жилистых хуйцов.
А они не абстрагируют от реализации контейнера. Как и исключения, модули, темплейты, смартпоинтеры, ссылки, поддержка ООП, небо, аллах. Кто тебе сказал, что задача ranges в том, чтобы полностью вытеснить итераторы?
> Можешь объяснить почему ub без просмотра видео на час?
Потому что области в памяти перекрываются. Например кто то запишет float в байты с 0 по 3й, а другой считает с байтов 2 по 5й. И кое что может пойти по пизде, из за предустановки что второй флоат никем не мог поменяться.
Только потом в этих форах ошибки off by 1 и переполнения буферов годами отлавливать.
Непонятное объяснение. Один записал в одно место, а другой считал это из другого, и закономерно получил херню. Вполне себе defined бехавиор.
Компилятор может выкинуть чтение, если считает что в то место никто не писал. Думаю так.
float f=blabla[0..3];
blabla[2..5] = 3.1415;
f=blabla[0..3] //выкинуто, компилер считает что в f уже считано
Я заметил что ты используешь слово выравнивание. Возможно у тебя произошла путаница с aligning? Aliasing это скорее "псевдониминг". Если совсем просто, то он означает, что в каждом участке памяти находится только одна переменная. Можно сказать, что этому участку памяти дан псевдоним с именем этой переменной. Если компилятор видит что области двух переменных перекрываются, он может решить да ну нахер такого не может быть это UB ) И вернуть просто 1. Можешь нагуглить это реальный пример.
Сорри не понял что за слово в спамлисте, вторая половина ответа !картинкой
Нет, я именно про выравнивание. Предположил, что на каких-то архитектурах чтение невыровненного флоата сильно медленнее, и потому компилятор использует предположение, что указатели выровненные (что верное в 99% случаев), чтобы программы не работали в два раза медленнее.
Первый раз за десять лет самообучения слышу что есть какая-то проблема с тем, что в одной и той же памяти две переменные.
>>735691
Так union вроде как сам язык определяет - для чего он тогда нужен, если он ub? Я понимаю если там указатели отдельные - тогда он мог бы предположить, но union это же явное указание неадекватности переменных?
Ну и ладно, всегда можно пометить как volatile - тогда оно вроде как раз должно отключать подобные оптимизации и предположения.
Единственная известная мне "ошибка" (я не знаю на сколько это ub - случайно нашёл когда пытался понять для чего нужен const_cast) стабильно возникает с const - то что компилятор излишне сильно предполагает что const сохраняет значения. Вот эта: https://ideone.com/pFSkKv
собственно, даже в видео тот чел сказал, что одно из UB там высосано из пальца, и надо поменять стандарт, чтобы это не было UB
Можно открыть проект в гитлабе и туда подглядывать. Состояние репа на любой коммит.
Грузить в онлайн я ничего не буду.
Прям открыть скорее всего никак (только если скопировать проект и открыть сразу две), но при смене ветки если ты настроил gui-утилиту для merge, то ты можешь просматривать и вручную сливать изменения.
Ещё можно вот так, переходишь на нужно ветку, правой клавишей кликаешь по другой и нажимаешь сравнить - и потом можно райткликом применять отдельные строки - но я не пробовал, не знаю насколько это будет удобно.
Тут кто-то вроде писал, что плоские использовать нет смысла, что они типа из двойных преобразуются в итоге.
>Ещё можно вот так, переходишь на нужно ветку, правой клавишей кликаешь по другой и нажимаешь сравнить - и потом можно райткликом применять отдельные строки - но я не пробовал, не знаю насколько это будет удобно.
Неудобно
>только если скопировать проект и открыть сразу две
Походу единственный приемлимый вариант
Почему так объявлять шаблон неверно, хотя в VS 2010 всё без бэ работает?
Благодарю, а про специализацию в инете хрен найдёшь чего, или как там это называется, эх.
union для экономии памяти, когда ты точно знаешь, что у тебя или int, или float. Записал int полчитал int - ок. Записал float прочитал float - тоже ок. Записал float прочитал int - UB.
> Первый раз за десять лет самообучения слышу что есть какая-то проблема с тем, что в одной и той же памяти две переменные.
Ну, теперь знаешь.
union
{
struct { int ★ a; int ★ b; } s;
int v[2];
};
Массив указателей разумеется
Address Sanitizer, написано же. Чтобы искать выход за границы массива и всякие преколы в коде от любителей высрать вот такое >>736011
На самом деле если не понимаешь что это и зачам — лучше даже не смотри в эту сторону, рано ещё.
>>736029
Да не почти, все попытки наебать систему типов это UB, просто потому что это обход вообще всего чего можно.
Просит передать адрес некоторого значения вроде
Понятно, а то я думал, что там выделяет только определённый объём памяти и я малость перестарался. Интересно, что VS на такое жалуется только тогда, когда ты лезешь в память чужого процесса, иначе молча принимает происходящее.
Ну так ты действительно перестарался, засунув свои ручонки в чужое адресное пространство, но это лишб один из кейсов.
VS тут вообще не при чём, просто видимо они используют вот эту либу в дебажных билдах https://github.com/google/sanitizers/wiki/AddressSanitizer — там же есть и полный список приколов которые она ловит с примерами.
Вот это в тему
Это может быть и не ub, не помню. Вот если бы там были разные типы, int[] и short, тогда было бы. Но в случае union только при доступе по другому типу, не тому который ты в него поместил.
Лямбды, функторы.
Выводить \n вместо \r\n. Если не работает, ты что-то делаешь не так, и сишка тут не при чём.
Там все рабочее, просто автор решил "упростить" вынеся в файл std_lib_facilities.h всякий бойлерплейт.
Некоторые примеры использую. Но думаю, что верный путь такой - Керниган Ритчи, Страуструп, и что-то дальше.
Я другой, у Шилдта чистал только про чистый си, и это больше на справочник было похоже - подходит если ты с другого не слишком высокоуровневого языка перекатываешься, но как справочник оно было очень хорошо - прям за час или два можно всё прочитать и вкатится. Не думаю что в книге по си++ что-то поменялось, но не читал.
По с++ мне Прата понравился, прям на порядок лучше страуса на полторы тысячи страниц, где дыры в информации и нет ответов на закономерные вопросы.
Дело в том, что он автор языка. Запутался наверное, сам то себе костылей уже написал и привык к ним.
Да и с языками не очень зашло
Да и целочисленных тоже
>Можешь объяснить почему ub без просмотра видео на час?
Берёшь стандарт и читаешь релевантные параграфы. Там всё просто в том смысле, что про UB сказано явно.
>Можешь объяснить почему ub без просмотра видео на час?
Видео вообще не при чём. Доступ к элементам массива char через glvalue с типом float это нарушение strict aliasing. А в видео про более тонкие вещи.
Это везде вроде так.
Не совсем.
То, о чем ты говоришь - это unspecified behaviour, т.е. зависящее от разработчиков компилятора, но всегда одинаково.
А undefined behaviour - это когда на одном и том же компиляторе сегодня так, а завтра по-другому.
Ну там есть интересный пример того насколько бывают компиляторы пидоры. https://godbolt.org/z/cpFd-T msvc и clang выдают адекватный и ожидаемый вывод строки Test1 (объект t1 был инициализирован конструктором Test1, который в свою очередь задал виртуальную таблицу класса Test1). И только gсс, компилятор пидор, начинает выебыватся и кричать "РЯЯЯЯЯ UB" не выдавая вообще нихуя.
WNDCLASS wc = { };
wc.lpfnWndProc = WindowProc;
wc.hInstance = hInstance;
wc.lpszClassName = CLASS_NAME;
И что в таком случае это:
HWND hwnd = CreateWindowEx(
0, // Optional window styles.
CLASS_NAME, // Window class
L"Learn to Program Windows", // Window text
WS_OVERLAPPEDWINDOW, // Window style
// Size and position
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
NULL, // Parent window
NULL, // Menu
hInstance, // Instance handle
NULL // Additional application data
);
Ты перепутал C++ и "ассемблер с классами"
это все параша чтобы беспонтовое окошко появилось. Руками окошки через винапи нынче рисуют только пенсионеры и дебилы
Мне проще через трубы.
Ну, класс в смысле категория. Есть класс окон-кнопок, окон-чекбоксов, окон-полей-ввода и так далее. Винда не знает что будет делать окно твоей программы, поэтому тебе надо зарегистрироваться в системе.
Я хочу работать с виндой и придти на работу и такой ебать, WinAPI знаю.
В чем указанное различие?
Зависящее от компилятора == не прописано в стандарте, а значит может измениться в новой версии компилятора, так что ждать там одно и то же поведение на разных версиях глупо. UB в одном и том же компиляторе скорее асего ведет себя одинаково, так в чем отоичие unspecified от undefinef?
Если ты про реализацию каких то стандартных алгоритмов или про тот же vtable(его нет в стандарте), то не понимпюч при чем тут это.
Я понимаю. Вот я и хочу овладеть WinAPI целоиком как API, а не как штуковиной для рисования окошечек.
А вот и нет, memcpy как раз не ub. И bit_cast это обертка над memcpy. Видео выше я уже скинул, там ответ почему и как.
Многие gnu программы принимают их по одному и тому же принципу -f par --foobar par. Это всё пишется вручную или есть какая-то либа, которая всё это облегчает?
В сишке getopt стандартный парсер командной строки. В крестах куча сторонних библиотек, boost::program_options, cxxopts итп
>А вот и нет, memcpy как раз не ub
Ну тащи определение поведения что будет если я поверх объекта какого-то типа скопирую байтики, которые я взял с потолка с какого-то левого файла
>И только gсс, компилятор пидор, начинает выебыватся и кричать "РЯЯЯЯЯ UB" не выдавая вообще нихуя.
Действительно пидор. Нет бы файлы в хомяке тебе затереть рандомом, он всего лишь нихуя не делает.
i++ + i++
union
{
struct
{
float x, y, z;
};
float values[3];
}
UB, но работает и будет работать во всех компиляторах.
У тебя двусмысленно получилось. Долбоебы - те кто пишут код с UB, или долбоебы, кто допустили само существование UB в стандарте.
А, такое согласен. Мудаки какие-то.
UB было необходимостью для Си, а точнее UNIX - без него она не была бы переносимой.
Да я вроде понятно написал, давай ещё подробнее.
Unspecified behaviour действительно ведёт себя одинаково, реализация зависит от разработчика. Как, например, некоторые стандартные алгоритмы, где порядок обработки не всегда регламентируется стандартом.
Undefined behaviour никогда не ведёт себя одинаково, а зависит от положения звезд, планет, Аллаха, оперативной памяти, секса соседа с женой и непредсказуем.
То, что ты скомпилил и оно ведёт себя так, как ты ожидаешь - не значит, что при следующем запуске программы или после следующей компиляции будет вести себя так же.
Самый простой пример:
int* a = new int[2];
std::cout << a[100500];
что не отменяет того, что ты можешь десять лет подряд тестить UB код и получать одно и то же.
Тоже это всегда выбешивало
Ну всякие нетфликсы юзающие ноду в проде под хуйлоадом точно делают, на равне с хуйлоад-питонистами и всеми остальными.
Я просто сижу пишу на C++ приложение под Windows для отечественной компании и хочу в web highload. Какие подводные вообще? Как делать?
А зачем тебе а шад? Ты же байтойобом идёшь работать, а не датасатанистом. Хотя алгоритмы для собеса выдрочить придётся. У нас хуйлоада на плюсах кроме хуяндекса я лично не помню (видел вакансии от авито и баду, но то такое).
>алгоритмы для собеса выдрочить придётся
Но их же дохуище просто. Невозможно знать их все и помнить. Я только поэтому и не хочу идти ни на какие собесы, боюсь забыть где надо инкрементировать j, а где декрементировать k, епта... Вообще, кто придумывает эти собесы ебанутые? На практике всегда есть возможность найти нужный алгоритм и по гайду написать. Имхо, если на помидора идешь и от тебя требуют опыт, достаточно только знать примерное название алгоритма, который подошел бы для решения задачи.
мимо
> Ты же байтойобом идёшь работать, а не датасатанистом
Да это шутка. Но типа алгоговно учить запарно, могут дать пососать.
> нас хуйлоада на плюсах кроме хуяндекса я лично не помню
А чё ты пишешь?
MEMCMP
tie
Ну, там обычно смотрят на параметры как ты это решаешь, иногда не дают тебе всех данных чтобы посмотреть насколько ты хикка и ссышь открыть рот и тд. Если не знаешь тему — так и говори, и прямо говори с чем хорошо знаком, это же не егэ, результат энивэй будет зависеть от общего впечатления а не от баллов. Я сам в таком говне с обоих сторон участвовал, хз что в яндексе, но всякого бреда уровня верчения деревьев на досках лично я не видал.
>>736881
>Да это шутка. Но типа алгоговно учить запарно, могут дать пососать.
Ну тут уж либо ты не ссышь и ходишь по собесам, либо тебе рано или поздно дадут пососать по з/п.
>А чё ты пишешь?
А я вообще выкатился из плюсов в мобилки после пары месяцев практики кое где на плюсах, и с тех пор вижу их только браузя вакансии. Сюда обычно забегаю спросить как там модули поживают.
>>736891
На го по ощущениям пишут скорее там, где пыха/нода/итд жирные, а жаву лень разворачивать, а не в прям ХУЙЛОАДЕ.
>к же, наверное, не хочу использовать никакие готовые формы типа TextBox и т.п. Как ни странно, инфы я найти на эту тему не смог особо... Ну и сама архитектура редактора интересует велосипедить особо не хочется. В качестве хранимого буфера могу представить какой-нибудь стек. Ну, а для поиска по файлу - обычный поиск подстрок.
На как раз Direct2D или там OpenGL, Рисуют внутри консоли, без виндового API
>>736943
ноп
>На чем пишут текстовые редакторы?
На чём удобнее конкретной команде/программисту.
>Используют ли для этого графические апи типа opengl или directx?
Ты ебанёшься на шейдерах рисовать гуи, это оверкил.
>Если нет, то что используют?
Гуи фреймворки или пилят свой (если писали игру и дописывают что-то к ней — то на своём слою абстракций или берут какую нибудь готовую либу вроде саблайма на skia).
>Так же, наверное, не хочу использовать никакие готовые формы типа TextBox и т.п. Как ни странно, инфы я найти на эту тему не смог особо... Ну и сама архитектура редактора интересует
5 минут гугла и вот такой вот рещультат
https://chromium.googlesource.com/skia/+/e73aa7573279cda200b80c1a858ae00762a5516b/experimental/editor
Со стороны геймдева я бы взял что-то типа freetype для вывода букв, и sdl для обертки над окошками. А может, даже взял бы что-то вроде litehtml для рендера, собственно, html. А то, что ты ищешь, называется text rendering component, и одна из самых распространенных, это Scintilla
Ну есть и есть, сказать-то ты что хотел? Свой гуй фреймворк строить с самого низкого уровня чтобы показывать массив битиков — это оверкил.
Отстой, qml гораздо удобнее. Пользоваться приходится обоими.
Clion по-моему медленнее VS
А, всё, существует std::wostream.
сейчас гуйню на С++ впринципе делают только немцы, дрочащие на кутя, и эстеты. Очень рекомендую освоить шарпы всем крестобогам, отличное дополнение к крестам
Ну смотри что на qt, что какой нибудь пикрелейтед, кишки на крестах, интерфейс на жс.
Шарп довольно удобный, но ксамл говно сраное.
Пользуясь случаем спрошу.
Как всё это скрещивается?
Типа пишется некий графический интерфейс, по задействованию элементов которого запускаются некие функции, написанные на С++?
И мне оч понравился т4, встроенное ПО для генерации кода это супер.
Там qml, ты пишешь очень простой код с вставками на жс, оно дёргает функции на крестах, которые ты специально объявил на подъязыке кюта. Звучит странно но это реально удобно.
И все это можно рисовать мышкой, и добавлять скрипты чтобы автоматом переводить из формата тз в прогу, я очень апнул скорость программирования как допер.
Про объявление я кажется понял, ибо недавно видел пример на хабре.
Поглядел по диагонали и теперь вопросы.
Я создаю игру со стадиями
Интро
Меню
Уровень
Настройки
Всё это дело есть абстрактный класс, наследники которого есть эти самые стади с общими методами для выполнения.
Далее, есть стадия настроек, в которой я могу поменять
Разрешение экрана
Режим экрана
Сложность
Количество кадров
Всё это дело пишется в некий файл конфиг
Возможно ли такое забабахать на qml?
Не, qml это просто gui в твоём случае, почти. Разрешение экрана будет автоматом, а вот остальное... Конфиг наверное будет искаропки, даже от ОС не зависит, может быть в файле, может в реестре, и тебе не важно где.
Я про это и говорю. Значит вполне сойдёт.
Я сам осилил сделать интерфейс с кнопками и текстом, но это малость напрягает, ибо больше по механике хочется напрячься.
У меня при открытии лайтрума вызывается нвидия оверлей, будто драйвер чекает, что это типа игры
This. И C++/CLI есть, если извращенец, и P/Invoke, если не в падлу все интерфейсы два раза переписывать.
Безопасный язык без GC, ебущий кресты по бенчмаркам, вершина компьютерных технологий и будущее системного программирования - говно? Ох лол.
>В этом случае memcpy подтвержденный стандартом метод решения данной проблемы.
Так значит тебе не составит труда притащить определение поведения
>C++/CLI
Как на нем сейчас пишут, руками от и до? Убрали ведь шаблон windows forms из VS для c++ после 2010 версии что ли.
Будет подмножеством C++30
>>736749
Это все из-за strict aliasing rule. Если упрощенно, то если указатель видит два указателя несовместимых типов, то он считает что они указывают на разные объекты. Соответственно когда код пишет в первый указатель, компилятор может посчитать что второй не поменялся и соптимизировать чтение из него нафиг.
Вот тут про такие вещи расказано, даже есть пример кода на котором это проявляется (в онлайн компиляторе с дизассемблером, но такое случается только при включении дополните).
https://gist.github.com/shafik/848ae25ee209f698763cffee272a58f8
>но такое случается только при включении дополните
но такое случается только при включении дополнительных флагов, насколько я знаю даже gcc по умолчанию позволяет делать type punning с enum.
Вот еще неплохая лекция на эту тему: https://www.youtube.com/watch?v=_qzMpk-22cc
Да мне-то зачем.
Я ведь ~свою жену~ плюсы сам пользую и другим не навязываю, а вот ты ходишь по другим тредам и ноешь, что твой раст всем нужен, но все тупые и не используют его.
Это неважно, в контексте type aliasing понятие "совместимые типы" имеет четкое определение.
https://en.cppreference.com/w/cpp/language/reinterpret_cast
>Informally, two types are similar if, ignoring top-level cv-qualification:
> they are the same type; or
> they are both pointers, and the pointed-to types are similar; or
> they are both pointers to member of the same class, and the types of the pointed-to members are similar; or
> they are both arrays of the same size or both arrays of unknown bound, and the array element types are similar.
> they are both arrays of the same size or at least one of them is array of unknown bound, and the array element types are similar.
Мне по работе надо было написать REST сервис - я нашлепал на ASPNet core. Кресты таки для другого. Хотя, в последнее время, меня мучает мысль о том, что 90% нашего софта можно переписать на шарпе а еще есть кернелдрайвер который переписать нельзя. Но остальное то можно.
Двачую, единственный адекват в треде, шизики уже 3 день мусолят и доказывают, что не уб, хотя все пруфы уже 3 раза запощены итт.
Это явно не все, потому что тогда любой указатель, любая рефка была бы ub.
int i;
int* r = &i;
А в твоей цитате рассматриваются только пары типов или пары указателей.
Дополню что
struct POD { float f;} pod;
float pf = &(pod.f)
Точно не UB.
Сложнее если полей в поде больше, потому что может быть паддинг.
sruct POD2 {
float f1
char[4] possible_padding;
float f2 }
float pf2 = (&(pod.f))[1]
Но тут вопрос именно в том UB это вполне defined.
Влпрос не в том норм это или не норм, а в том определенное или неопределенное поведение.
ну так может быть тебе стоит изучить плюсы вместо того чтобы фантазировать? Материалы тебе дали.
Ну так может ты просто укажешь конкретный пруф на то что это UB, а не будешь просто пердеть в треде?
Ты там с зеркалом разговариваешь? Может ты не понял, но я тебе уже указал что пруфы "для двух указателей на разные типы" никак не доказывают ub в унионе с под структурой.
Еще раз, я не буду тебе объяснять то, что уже много раз разжевано другими людьми, просто потому что тебе лень прочитать текст по ссылке
Быстро ты слился.
Раст это такая современная Ада. В лучшем случае будут на нем забивать координаты в ядреные ракеты, в худшем - отправится вслед за прологом.
Дак там это тамщета фаерфокс хуя пососала с растом в прочем как и любой кто его действительно использовал. А вообще язык хуйня неимоверная, какую еще поискать надо, что это блять за убийца C++, который безопасно работает с памятью? Ты там ебу дал?
Я серьёзно.
Он уже давно эту хуйню несет, пруфов так и нет. Хуево быть сектантом.
Да, не нужны.
Так а че это ты привел две совершенно разные категории? Продавец вроде бы не заявлялся как "будещее системного программирования".
И где фф пососала хуй с растом? В чем это, блять, выражается?
>безопасно работает с памятью
тащемта да
Любой современный язык небезопасен, так как компилятор содержит ошибки (статистически должен из-за сложности) и может сгенерировать некорректный код.
Что тебе мешает не абузить ансейф?
Что тебе мешает тестить точечно ансейф код, повышая шанс отлова опасного бага? Ведь в С/С++ весь код - UB, а в расте хотя бы знаешь где может быть заложена свинья.
Есть проекты и без ансейф кода вообще, он не везде нужен.
Удачи тебе найти переполнение буфера в джаве или сисярпе, лол (они уже могут компилиться в нативные бинари). Не, в самой инстраструктуре могут быть такие дыры, ибо она написана на С/С++, но есть языки, которые неуязвимы к ошибками памяти (тащемта любой managed язык)
Ой, да конечно блет. C# это кал который нормально работает только под вундоуз. Зачем, когда есть wxWidgets, или накрайняк КУТЭ?
А вообще, зачем писать гуи в принципе... всё в веб уползает.
Да. Лабы
Было пару раз в 2018 брал заказы, на QT быстренько нашлепать приложение, однако потом это перерастало в обычную работу. Но это большая редкость.
Ансейф будет в либе, которую юзает другая либа, а проявляться будет в твоем коде который это вызывает. Ну и в расте тоже есть ub.
Ну использование крестов это уже по умолчанию ложение хуя.
>неткор
Кто-то это говно вообще юзает помимо виндузятников? Понятно что у майкрософта кучу gachi-технологий которые никому не упали
Это не теория, с actix именно так и произошло.
Скачал курсы по обоим, а там просто трата времени бессмысленное. Какие-то дроби, числа огромные. И самое главное, что там нихуя не объясняется что они делают. Просто блять пишут всякие дроби, а потом говорят - это дроби. Ну ахуеть! Я понял, что бывают разные переменные, но причем тут всякие дроби? Вы что программируете дробями? Пиздец нахуй. Нечто подобное помню было когда изучал HTML. Там тоже какую-то хуйню втирали, которую нигде не используют. А верстать на нем я научился когда делал себе одностраничный сайт. Вот только с С# и C++ так не получается. Помогите с чего начать, как научиться использовать эти языки, чтобы потом дополнять нехватку знаний дробями из курсов?
Книги.
Че за дроби?
Протекающие абстракции.
Это другое.
дохуя кто, отличная штука.
>Даунгрейд
Читабельность когда, с форлупами и итераторами где много конструкций заебешься отслеживать что и где, а тут такие красивые пайпы
Главное не написать blabla | 0 вместо blabla, 0, зато красиво.
zlib
Читни про алгоритм Хаффмана и информационную энтропию.
Грубо говоря, в языке всего 32 буквы, а в байте 256. Значит уже на букву надо около 5 битов, а не 8. Дальше, буквы встерчаются с разной частотой. Гласные ОЕАИ занимают 33% текстов, а цщф - меньше процента. Значит, можно частые буквы кодировать 2-3 битами, а редкие более длинными последовательностями.
zlib, сейчас вроде еще brotli
Не обязательно ждать окончательного утверждения нового стандарта, чтобы уже начинать писать компилятор, реализуая сначала устоявшиеся фишечки, которые редизайнить потом не будут.
Это же поток, там должна быть перемотка, не?
Как тогда сделать что-бы строка из stringstream переместилась в мою строку без копирования? std::string&& string = stringstream.str(); сработает копирование или перемещение? Я немного не в теме всех этих перемещений.
https://en.cppreference.com/w/cpp/io/basic_stringstream/str
Гугл говорит, что тоже никак, прямого доступа к внутреннему буферу stringstream нет, а str() каждый раз копирует строку заново.
https://stackoverflow.com/questions/26266525/move-the-string-out-of-a-stdostringstream
https://stackoverflow.com/questions/35726798/is-it-legal-to-move-the-str-member-of-a-stringstream
Я бы посоветовал вообще не юзать спинлок если ты не уверен на 100% что делаешь. Понять нужен ли он тебе можно по следующим пунктам:
— У тебя мало потоков (желательно <4, иначе накладных расходов из-за дрочащих циклы потоков будет явно больше чем от переключения контекста каким нибудь мутексом), т.е. использовать с какими нибудь корутинами шедулящимися по потокам точно хуёвая идея;
— Изменение быстрое (по крайней мере не особо жирное, если будешь переиндексировать всю базу эти спинлоки отправят тебе процессор нахуй в троттлинг).
Насколько я понимаю понятие оптимистик лока — да, но если хочешь спать спокойно лучше выбери что нибудь более предсказуемое.
Да, уже утвердили. Здесь можно посмотреть прогресс по имплементации фич
https://docs.microsoft.com/en-us/cpp/overview/visual-cpp-language-conformance?view=vs-2019
>Да, уже утвердили.
https://www.iso.org/standard/79358.html ещё до Approval не добрался, не выдумывай.
Комитет его утвердил в Праге в феврале. Де-факто стандарт 20 готов.
Нужен ли const параметрах функций для фундаментальных типов и нужен ли он для переменных в телах функций?
1. литеральные строки автоматически const
2. желательно ставить const перед таблицами констант
3. все указатели на сущности, которые ты не собираешься менять, объявлешь как "const foo ⛧"
4. опционально
const int pi = 4; // здесь const запрещает pi++
while (m_locked.test_and_set(std::memory_order_acquire)) std::this_thread::yield();
const нужен там, где ты внезапно не собираешься менять содержимое.
Например: если у тебя функция возвращает длину строки, не меняя ее, то size() const. А если ты делаешь функцию set_value(int x) которая меняет состояние объекта, то не она не const.
Параметры функций примитивных значений не надо - они передаются копией по значению. То что ты поменяешь параметр внутри функции, внутри функции и останется. Если же ты передаешь объект внутрь функции, то опять же, если ты гарантируешь что не будешь его менять, а только считаешь из него данные - то const. Если же ты именно меняешь полученный объект - то не const.
Зачем он переменным - загадка. Зачем заводить константную переменную внутри функции? Константы надо хранить где-то в другом месте. Завести отдельный класс или неймспейс.
Спасибо за обширный ответ.
везде, где можешь.
Ну, наверное компилятор сможет оптимизировать больше, если он видит что это константа. С другой стороны, есть const_cast.
Да, но при компиляции с -O2 конпилятор чаще всего расставит за тебя const там где ты не поставил, поэтому ставишь больше для себя
Обычно почти не влияет. Она влияет на корректность.
const_cast нужен, чтобы приводить неконстантные вещи к константным в стиле "современных плюсов". Снятие константности таким образом ведет к UB, что и написано в стандарте.
Компилятор как раз может конст каст соптимизировать и положить значение в read only память.
>приводить неконстантные вещи к константным
А смысл? Если они внутри либы остаются неконстантными. А значит это все равно UB когда их поменяют.
Так не меняй.
> const int pi = 4; // здесь const запрещает pi++
Дедуля, все уже давно constexpr пишут, обновляйся
> Зачем он переменным - загадка. Зачем заводить константную переменную внутри функции?
Что значит зачем? Затем же, зачем и параметры передавать по константной ссылке.
auto const values = GetValues();
Единственный случай, когда не нужно - это в RVO
Хочу сделать это с помощью cmake. Желательно версии 3.10, но если очень надо, можно и свежую скомпилировать.
Сейчас есть следующие директории (может это надо как-то реорганизовать, я не знаю):
build
doc
test
lib — сюда хочу запихивать сторонние библиотеки
src — собственно, исходники проекта. Вероятно тут будет лежать только main.cpp, а остольное распихано по директориям типа src/core/, src/server/ и т.п.
Сейчас это собирается баш скриптом, который выглядит так
cd build
cmake ..
cmake --build .
cd ..
doxygen Doxfile # генерирует документацию для всего, что в src/*
CMakeLists.txt в корневой директории выглядит так https://pastebin.com/VBWVG2ZY .
Есть одна либа с гитхаба, которую я хочу использовать. Если сделать git clone, то создастся следующая структура
YetAnotherLib/
YetAnotherLib/doc/
YetAnotherLib/cmake/
YetAnotherLib/CMakeFile.txt
...
YetAnotherLib/YetAnotherLib/ — собственно, сами исходники.
Сейчас я в main.cpp могу написать
#include "core/MyObj.h"
Но не могу написать
#include "YetAnotherLib/YetAnotherObj.h"
А хотелось бы.
Не "YetAnotherLib/YetAnotherLib/YetAnotherObj.h" и не "lib/YetAnotherLib/YetAnotherLib/YetAnotherObj.h". Тем более, что в той либе есть инклюды типа "YetAnotherLib/subdirectory/SomeOtherObj.h", так что даже если тупо скопиастить директорию с исходниками или всю директорию с гита в src/, собираться не будет.
Джва часа проковырялся с этим, но так и не понял.
Хочу сделать это с помощью cmake. Желательно версии 3.10, но если очень надо, можно и свежую скомпилировать.
Сейчас есть следующие директории (может это надо как-то реорганизовать, я не знаю):
build
doc
test
lib — сюда хочу запихивать сторонние библиотеки
src — собственно, исходники проекта. Вероятно тут будет лежать только main.cpp, а остольное распихано по директориям типа src/core/, src/server/ и т.п.
Сейчас это собирается баш скриптом, который выглядит так
cd build
cmake ..
cmake --build .
cd ..
doxygen Doxfile # генерирует документацию для всего, что в src/*
CMakeLists.txt в корневой директории выглядит так https://pastebin.com/VBWVG2ZY .
Есть одна либа с гитхаба, которую я хочу использовать. Если сделать git clone, то создастся следующая структура
YetAnotherLib/
YetAnotherLib/doc/
YetAnotherLib/cmake/
YetAnotherLib/CMakeFile.txt
...
YetAnotherLib/YetAnotherLib/ — собственно, сами исходники.
Сейчас я в main.cpp могу написать
#include "core/MyObj.h"
Но не могу написать
#include "YetAnotherLib/YetAnotherObj.h"
А хотелось бы.
Не "YetAnotherLib/YetAnotherLib/YetAnotherObj.h" и не "lib/YetAnotherLib/YetAnotherLib/YetAnotherObj.h". Тем более, что в той либе есть инклюды типа "YetAnotherLib/subdirectory/SomeOtherObj.h", так что даже если тупо скопиастить директорию с исходниками или всю директорию с гита в src/, собираться не будет.
Джва часа проковырялся с этим, но так и не понял.
> устанавливать зависимости
ахахах
АХАХАХ
АХАХАХАХАХАХ
Я как раз решил сегодня обмазаться conan'ом и vcpkg'ом, уже часа 3 копаюсь. Первый работает так, будто я взял альфа-версию, второй - будто бету.
Ладно, vcpkg в ебанной вижуалке работает нормально, с cmake+mingw же полный пиздец.
Почему параметры это как раз понятно. Функция в другом файле, написана другим человеком.
А тут то зачем? Если только склероз и ты забыл зачем получал переменную.
const int a = get2()
const int b = a * a
Тоже конаном недавно пользовался, все завелось под виндой. Чего то не было в бинарном виде в дебажном виде, собрал из сорцов. Добавлял cpr и openssl чтобы качать сайты и какую то либу чтобы обрабатывать изобоажения.
> Почему параметры это как раз понятно. Функция в другом файле, написана другим человеком.
То есть в своих функциях ты не по константой ссылке данные передаёшь?
> А тут то зачем?
Очевидно, чтобы подчеркнуть тот факт, что ты эти данные собираешься только читать
О, на наши лабы в универе похоже, только у нас пунктов в 1.5 - 2 раза больше.
Пиши структуру, которая будет содержать эту структуру и две ссылки на саму себя. Создаешь новую структуру оператором new и задаешь для нее предыдущую, для предыдущей следующую.
Да ну, чел, попытайся сам сделать. Отучивайся быть пидором. Сделай отдельно структуру и эти алгоритмы добавления удаления хуения и скинь код сюда если где-то ошибка есть или чет конкретное непонятно.
так это действительно сложно, я пытался найти что то в тырнетах там инфы 0
Не умеешь искать. У меня однокурсники целиком классы списка находили. Но если совсем не можешь, используй STL, скажи, что по постановке задачи все верно.
Да не нужна тебе инфа никакая. Для этого. Просто создай структуру, и сделай 4 функции.
1. Создать первый элемент списка. Принимает параметры(все кроме указателй), инициализирует, сохраняет. Возвращает указатель на структуру
2. Добавить элемент. Принимает первый(но это не точно) элемент списка, идёт по указателям до конца(пока не nullptr) и когда доходит до конца добавляет.
(Первые 2 можно объединить)
3. Вывод всего списка.
4. Удаление всего списка из памяти. Либо сначала, либо с конца, как хочешь.
А после того как готово будет можно дальше идти.
Что значит "что за что отвечает"? Там же подписано - за наименование лекарства отвечает char* name
Ну да, вместо того, чтобы вручную качать каждую либу, вручную искать её зависимости и собирать, а затем в вижуалке все эти либы вручную прописывать, люди используют vcpkg, который всё это делает сам. Ух, пердолинг так пердолинг.
ну у парней проблемы с vcpkg за пределами вижуалстудии (что странно).
А ещё лучше контейнеры с типом std::string, хотя хотелось бы посмотреть на оба варианта.
Не выдумываю.
Сейчас бы завязываться на непереносимый формат проекта работающий в одной ОС..
Ну можешь в блокноте программировать, мне без разницы.
Щас бы дрочить на эфемерную кроссплатформенность для своего проекта, которая нахуй не нужна почти нигде.
Сейчас бы не знать что почти всё кросплатформенное и нужно следовать стандартам если твой проект не нахуй никому не нужен.
>Сейчас бы не знать что почти всё кросплатформенное
Сейчас бы не знать что сейчас почти всё кросплатформенное
Сейчас я хуй знает, 2 додика каких-то, один сейчас не знает про cmake, другому сейчас кросплатформенность не нужна.
Делай все по частям, по шагам. В этом и есть смысл программирования. Что такое указатели знаешь? Что такое new/delete? Ну вот у тебя есть структура, там кроме данных есть указатель на следующую запись списка и на предыдущюю. Включай логику, рисуй схемы. Каким может быть указатель? Правильным на другую запись, или нулевым, например в последней записи. Как пользоваться списком? Надо где-то завести указатель на первую запись, остальные ты сможешь получить переходя по указателю на следующую. Как удалить список в памяти? Надо удалить каждую запись, начиная с первой. Как вставить элемент в конец списка? Дойти до последнего элемента, там следующий будет nullptr, вписать туда указатель на новый элемент. Как удалить элемент из середины списка? Надо чтобы список остался в согласованном состоянии, значит надо изменить указатели так, чтобы указатель предыдущего начал указывать на следующий (и наоборот), а на этот теперь никто не ссылается и его можно удалить delete. Как сохранять в файл? Ну видимо открыть файл и записать каждую запись списка по порядку, каждое поле по порядку. И т.д.
В stl нет абстрактных классов, ни как скорее всего.
> эфемерную
Сейчас бы не мочь задеплоить свой проект на сервер с линуксом, потому что не дрочил на кроссплатформенность и делал всё для винды.
Когда в требованиях нет поддержки линукса - это никогда не наступит.
Можно сделать, чтобы принимались любые контейнеры с нужными методами. Утиная типизация в C++, лол.
template <typename T>
void f(T t)
{
t.push_back('x');
}
std::vector<char> vc;
std::string s;
f(s);
f(vc);
Очень противно качать какую то либу с гитхаба, а там расширения компилятора или уникальные типы. На малиночку-ардуиночку не засунуть. Нормально делай нормально будет.
я писал выше про проекты, а не про либы. Либы должны быть кроссплатформенными по возможности. А вот коммерческий проект пилить под то, где оно нахуй никогда не потребуется - смысла нет.
Неплохо, а я уже такую хуйню нашел/написал.
template<typename T, typename Enable = void>
class X;
template<class T>
class X<T, typename std::enable_if<
std::is_same<T, std::vector<std::string>>::value ||
std::is_same<T, std::list<std::string>>::value>::type>
{
T t;
public:
X(T t) {
this->t = t;
}
void push_back(std::string value) {
t.push_back(value);
}
};
красноглазый даун не человек, а так, лишь пердоля
Перестать быть макакой для начала.
Сереженька, кушать иди)
Ещё не юзают. Скинь сниппет, как это сделать рэнжами
Зачем мне ranges, если хватает итератора?
Посмотри на шаблоны из stl.
template<typename It>
void for_each(It beg, It end) {}
template<typename It>
void add_result(It to) {}
Можно хоть обчитаться, но все равно обучение сводится к методу проб и ошибок.
Алсо я читал, что когда еще мышечная память задействована наряду с мозгом, запоминание гораздо эффективнее, т.е. надо вручную все вводить, а не копировать куски.
В std у всех контуйнеров похожий api, реализуешь через темплейты. Можешь делать тайп дедакшин ещё.
Если какая-то вещь не понятна, то можно глянуть. А весь плейлист это ебнешься, подача информации очень медленная по сравнению с книгой.
Федя, зачем тебе авторизация в IDE? Пиздец, что эти ёбаные отсоциальные сети делают с людьми
Им не до этого. Нужно пилить ИИ, совместное редактирование и делать интеллисенс ещё медленнее.
У меня как-то заблочили учётку и попросили телефон для разблокировки, даже удалить учётку без указания номера нельзя. И с тех пор я регаюсь там на 10-минутное мыло, и каждый раз, когда учётку блочат, регаюсь заново.
В смысле блядь?
слышал, похожая хуйня есть в установщике десятки, но там можно кабель выдернуть и появится кнопка пропустить
Нет, оказалось что учётка по какой-то причине забанена.
Пока через браузер не зайдёшь - не узнаешь.
>с cmake+mingw же полный пиздец.
Поставь MSYS2, там все искаропки, пакман как в арчике, вообще пердольства нет. Куча пакетов под небо и аллаха, даже для Qt статически собранный пакет есть.
>Когда в требованиях нет поддержки линукса
В РФ везде сейчас поддержку астралинукс для софта требуют.
Поставил, понравилось, спасибо. Раньше только cygwin пробовал, в котором пакеты ставятся очень странно, ну и в git-bash нет менеджера пакетов.
Наверное, это намёк на type traits, но в изначальном посте сказано ясно - однобайтовые типы. Пусть это хоть какой-нибудь float8_t.
Си тред два блока вниз.
Ясно.
В очередной раз кодер 300ккк/нс не смог отличить авторизацию от аутентификации
итераторы
Ты, вероятно, вот про это спрашиваешь?
https://stackoverflow.com/questions/8130602/using-extern-template-c11
То - что у тебя на скрине, это специализация ручками
Путаю, а она невозможна что ли для функций возвращающих значение?
Для пустого типа то я умею делать
Да, это. Но почему низя прост ниже объявить список типов для специализации, как я хотел выше или как предлагают для функций не возвращающих чего-то?
ты либо делаешь специализацию, как это сделал я, либо обьявляешь нужную тебе функцию без какого-либо отношения к тимплиту, т.к. при overload resolution выберется именно функция, а не тимплит по приоритетам. Третьего не дано.
Я не совсем понимаю, что такое список типов для специализации. Нужна специализация - пиши, нужна generic специализация для нескольких типов? Ебашь SFINAE, или концепты.
Понял, для меня и концепты и SFINAE не нужны, следовательно обойдусь целым случайным числом.
С ужасом подозреваю манускрипты, которые пишут таким образом, но не просто так прогеры деньги большие получает.
По мере надобности, я не настолько йоба прогер, чтобы использовать такое. Уже не первый раз натыкаюсь, даже читал у Страуструпа, на невозможность перегрузки по возвращаемому типу, что странно и вроде бы даже понятно.
а, блядь, я наконец-то понял о чем ты. Специализировать можно, а вот перегружать - низя, т.к. overload resolution не поймет, что конкретно ты хочешь.
Книжка из шапки подойдет для коллективного вката?
Зачем вам этот вкат? Если вы хотите сменить карьеру - то С++ это один из худших возможных вариантов, в связи с отсутствием джуновских позиций.
Если чисто для себя порофлить - тогда ок, и с С++ начинать тоже вполне ок. Книги в шапке говно, но я вообще не видел ни одной нормальной книги по С++ для новичков.
C++ - ебануться какой сложный язык, и многие, кто начинает с него, потом забивают на программирование. Но если достаточно усидчивые - дерзайте.
Фишечек всяких намного больше, чем в других языках. Изучать эти фишечки намного дольше. И потом при чтении кода приходится дольше вспоминать, как они работают.
Конкретно? Темплейты; сложно победить UB. а ещё сложнее из-за тех долбоёбов сверху, которые РЯЯЯ UB НО РАБОТАЕТ; прямая работа с памятью; при юзании сырых указателей легко обосраться; нет универсальных способов для сборки проектов и разрешение зависимостей, даже для подключения сторонних библиотек нет универсального способа, собирать эти библиотеки из исходников зачастую самому; постоянно надо думать, как не проебать хоть 0.000001% перфоманса, вебня на крестах; компиляция может длиться часами; километровые и непонятные ошибки компиляции.
Но зато потом любой другой язык будет казаться псевдокодом.
Мне наоборот было проще осваивать С++. В нём абсолютно нет магии, которая есть в скриптовых\VM-based языках. Любая высокоуровневая сложная конструкция без проблем разбирается на простые манипуляции байтиками, в отличии от питонов\шарпов на которых я писал и нихуя не понимал, что там под капотом.
Я другие языки учил уже после плюсов и хз, каково их учить с нуля. Но почти все пишут, что легче.
На скриптовых зато легче решается класс задач, когда нужно тяп-ляп - и готово, хоть и не до конца понимаешь, как это работает. Но в них этого и не требуется, там подход - верить в магию и надеяться, что не выстрелит.
А ещё lvalue, rvalue, xvalue, gvalue, pvalue, nenovalue, allahvalue.
Да сейчас uniform initialization можно везде хуярить и будет работать. Т.е скобочки { } без знака равенства =.
> Installation of Qt binaries will require a Qt Account
> Long-term-supported (LTS) releases and the offline installer will become available to commercial licensees only
> everyone, including open-source Qt users, will require valid Qt accounts to download Qt binary packages. We changed this because we think that a Qt account lets you make the best use of our services and contribute to Qt as an open-source user.
> We want open-source users to help improve Qt in one form or another, be that through bug reports, forums, code reviews, or similar. These are currently only accessible from a Qt account, which is why having one will become mandatory.
М-да. Так похоже на Oracle с жабой: либо плати, либо будь бета-тестером. Понятно, что хочется заработать денежек, но такое пидорское отношение к пользователям опенсорса нищебродам вызывает очень много вопросов.
Это, скорей, относится к Си или "си с классами". Во что разворачивается какая то конструкция с++ угадать очень трудно, особенно новичку. А главное, малейшее изменение, причем не тобой, может кардинально все изменить. Ну например, в глобальное пространство имен кто то добавит функцию, из за этого выводы темплейтов станут другими, и твоя функция, которую ты считал константной времени компиляции, станет рантаймовой с оверхедами.
Где-то у них есть файлопомойка с сурцами, пошарься. Сам еле нашёл в своё время.
Сорцы-то есть, они любезно написали в своём посте, что по-прежнему можно собрать самому, не регистрируясь. Понятно, что большинство этого делать не будет и смирится с новыми условиями.
Вот кстати поддвачну, на шарпе вроде приятно писать, библиотека заебись, сахарок, всё такое, но вот если надо понять, какие конструкции приводят к аллокации из кучи, а какие нет, то начинается ебучая магия. В С++ с этим гораздо проще.
> нет универсальных способов для сборки проектов и разрешение зависимостей, даже для подключения сторонних библиотек нет универсального способа, собирать эти библиотеки из исходников зачастую самому
Вот это пожалуй единственное, с чем может столкнуться новичок и с чем ему придётся серьёзно разбираться. Хотя в последнее время в 99% случаев написать vcpkg install my_liba.
Всё остальное - это сложности, которые возникают уже у людей с опытом.
Поддвачну. В нормально отформатированном коде на c++ понятна каждая строчка.
Слцшал мнение, что это около-синдром утенка, связанный с типизацией. Тем, кто начал со статической, тружно с динамической, и наоборот.
Страуструп уже лично просит не начинать изучение плюсов с Си, это ведет к тому, что люди пишут на Си с классами. Если нужен Си - учите Си, если нужны плюсы - учите плюсы.
"Но си это фундамент!!1" - ASM тем более, но лучше начинать учить что то прикладное, а потом идти вглубь, не нужно школьникам про p-n переходы в транзисторах рассказывать, как только они захотели поучиться проге.
Купите вскладчину Белый пояс Яндекса и кайфуйте. Если вы учитесь в каком нибудь вузе, то можно и бесплатно получить.
Типизация это другое - шарпы тоже статические, однако магия присутствует.
Но да, я не понимаю как можно писать на языке с динамической типизацией что-то большее, чем 200 строчек.
сырые указатели используются тогда, когда они не владеют памятью
Посмотри, какое исключение и примерно где выбрасывается, подключись дебаггером и жди
>Посмотри, какое исключение и примерно где выбрасывается, подключись дебаггером и жди
>Двач, при запуске программы выбрасывается исключение, во время дебага всё нормально как бы я не пытался отыскать проблему. Как мне найти в какой строке происходит ошибка если код большой и много заголовков?
Тебя не учили подключаться дебаггером к релизной версии?
> в какой строке
> примерно
Ну блядь если ты не знаешь, какая часть кода у тебя за что отвечает, то может и не стоит этим заниматься?
Пиздец, оберни в таком случае всё в try-catch и потихоньку выноси оттуда код, вот ты и узнаешь, где ты обосрался
>Тебя не учили подключаться дебаггером к релизной версии?
Не учили
>Ну блядь если ты не знаешь, какая часть кода у тебя за что отвечает
Выбрасывается std::out_of_range what(): std::substr. Мои std::substr ничего не выбрасывают
>то может и не стоит этим заниматься?
Хуй будешь?
>Пиздец, оберни в таком случае всё в try-catch и потихоньку выноси оттуда код, вот ты и узнаешь, где ты обосрался
У меня много много кода, я заебусь всё оборачивать и код работает с Qt что не позволяет оборачиваться в try-catch.
>сказала чмоха с подобными высерами:
>Посмотри, какое исключение и примерно где выбрасывается, подключись дебаггером и жди
>Двач, при запуске программы выбрасывается исключение, во время дебага всё нормально как бы я не пытался отыскать проблему. Как мне найти в какой строке происходит ошибка если код большой и много заголовков?
Я ответил тебе, теперь ты умрёшь.
в чем проблема проверить substr?
> Двач, при запуске программы выбрасывается исключение
> Как мне найти в какой строке происходит ошибка если код большой и много заголовков?
> при запуске программы
> как найти где происходит ошибка
> при запуске программы
в конструкторе смотри.
можешь запись в лог-файл/консоль прикрутить по-быстрому. так и без дебаггера увидишь, где упало
Что, даже если к релизному экзешнику через windbg подключиться ничего не даёт?
Как лучше всего искать узкие места в коде? Есть ли какой-то уже готовый инструмент, чтобы не писать руками вывод в файл? Код обрабатывает большой поток данных в цикле, и как-то бы автоматически рассчитывать среднее время, которое на это все уходит, чтобы сразу наглядно видеть, где программа тратит реально много времени.
в студии встроенный профайлер есть. Если он тебе не нравится - есть Windows ADK с Windows Performance Recorder'ом
>std::vector< int > Array = { 5,6,7,-1,6,10, 32,-5, 0, 4 };
Хули ему не нравится?
Я не сомневаюсь, но что-то у меня не так.
Вроде бы даже 2010 это умеет, поэтому я перекатился на 2019, но чот не робит.
Не помогло, зато помог быстрый поиск и замена компилятора, ух, но всё равно благодарю.
По умолчанию, что интересно, та версия VS 2019, которая у меня есть максимум С++ 17 поддерживает.
Ксеон из раздела /hw за 20 000 с 16 - 24 потоками
Федора или бабанта с КВМ/КСЕН
Ну и далее устанавливаешь систему нужную на вирутальную машину
Не. У меня нет возможности держать 24/7 включенным компьютер. Интересует именно аренда
Какие фрамеворки желательно знать сейчас С++ прогеру?
Вот хочу ща опробовать Qуtэ, а что ещё есть?
Купить любой VPS, на него поставить nginx или апач (если его там ещё нет), к нему подрубить свою прогу на крестах через CGI/SCGI/FastCGI
Понял
Открываешь hh, смотрешь что в вакансиях.
По хорошему надо знать сами плюсы, включая STL.
Дальше можно посмотреть Boost, почти всё там - кандидаты на попадание в стандарт. Еще можно посмотреть репу awesome-cpp, там тоже куча всчких фреймворков, среди которых можно найти интересные лично тебе.
А как начинать то блядь тогда? С++ создавался на основе С, причём когда-то давно был С с классами, а потом добавили шаблоны, наследование и прочее.
Я не понял тебя, это звучит убер странно.
Понял
С чего нибудь типа cppcoreguidelines, с unique_ptr и shared_ptr, с векторов и стрингов, думаю так имеется в виду.
С этим соглашусь
Пиши на том, на чём умеешь. Переписать логику на другой язык будет сильно проще потом.
Нет. Больше половины клиентской части я сделал.
Правильно я понимаб, что если взять curl то можно легко написать взаимодействие с сетью и потом об этом не парится, а просто заниматься дальнейшей обработкой?
сервера пишутся на буст асио обычно, и это совсем другой уровень сложности чем всё пхп вместе взятое
В чем премущество перед curl? На curl был небольшой опыт раьоты с api сайта. Буст разве не огромный дохуя? нет желания тянуть столько
Точно............
А есть че по проще буста. Я могу загуглить, но может есть пооверенные варианты. Но правильно я понял, что если я использую библиотеки, то не должен думать о сетевой безопасности?
Безопасность бывает разная. Думать о ней тебе все равно придется - что если читер расковыряет твою игру и пропишет урон в 10 раз больше?
да хз сделал страуступу какому-то вроде доволен
давай, 300кк\нс не за горами
tl;dr Чел прилумал язык и недоволен, что перед его изучением заяем то учат ДРУГОЙ язык
https://youtu.be/fX2W3nNjJIo
Думать о безопасности надо всегда, когда пишешь что-то сетевое. От этого тебя никакая либа и никакой язык не спасёт.
С++ конечно быстрее в разы, и по памяти тоже можно выжать сильную экономию. Грамотно написанный сервер можно хоть на одноплатнике держать, у которого мощности как у паршивого смартфона. Тут главное чтобы программа не уперлась в I/O, потому что если она будет делать по десять запросов к базе на каждый пук, то С++ ей ничем не поможет. То есть, сразу надо думать, куда и как часто будут ходить данные, и это не просто "взять и переписать на другой язык".
Правда, сложность разработки веб херовин на С++ довольно высокая, особенно если брать в расчет безопасность. Если браться за такое, то либо для себя по фану чтобы научиться, либо если уже хорошо знаешь, что делаешь. А если под заказ и без опыта в таком деле, то на крестах писать не самый удачный вариант — наогребаться можно просто лютейше.
Проверку на дурака забыл.
>Но правильно я понял, что если я использую библиотеки, то не должен думать о сетевой безопасности?
Если используешь библиотеки, безопасность не под твоим контролем.
std::out << '\r';
какой возвращаемого значения у new T[x][x] чтобы дать его члену класса?
*какой тип
А иначе хуй ты память с [][] выделишь. Или пакуй в одномерный массив/вектор/вектор-с-векторами.
осталось только найти компилятор это поддерживающий
Можно разнести по разным файлам и подключать их уже системой сборки.
Без ифдефов трудно обойтись, но начинать стоит с создания отдельных файлов с обертками (my::createFile гыгы) под каждую платформу.
Всмысле?
английский учи бля никакого на русском
ну и как обычно посмотри пару видосов по азам потом возьмись за небольшие проекты и сверяйся с SO + cppreference
>SO + cppreference
Что?
Если про Питон и ЖС литературы до жопы, то на плюсах тоже.
И на Питоне все стандартно читают несколько основных хороших книг для вката, все на русском.
Неужели с плюсами ситуация не аналогичная?
> писать http парсер
Почему, ну почему крестовики никогда не используют готовые http-либы и каждый раз их пишут с нуля чуть ли не через winapi? Бог дал им Poco, cpp-netlib и ещё сотню других, но нет, надо снова и снова изобретать велосипед.
HTTP/2 не нужен.
> Что?
stackoverflow.com и ru.cppreference.com
> основных хороших книг
Бьерн Страуструп.
"Язык программирования С++ "
все остальное от лукавого
> Почему, ну почему крестовики никогда не используют готовые http-либы и каждый раз их пишут с нуля чуть ли не через winapi? Бог дал им Poco, cpp-netlib и ещё сотню других, но нет, надо снова и снова изобретать велосипед.
Так я пишу, что не собираюсь этого делать и ищу либу где сделано за меня.
> HTTP/2 не нужен.
Почему? HTTP 1.1 старый же очень
> ищу либу где сделано за меня
Полно всяких, см. Communication: https://en.cppreference.com/w/cpp/links/libs
Про парсинг http забудь. Даже если взять готовый парсер, придётся руками прикручивать SSL/сжатие/менеджмент потоков/хелперы даже для банального роутинга.
> Почему? HTTP 1.1 старый же очень
Но используется повсеместно. 2.0 даже не поддерживается толком нигде.
Мне cpr понравилась, я ей спарсил одни сайт. Обертка над curl. Https через openssl
https://github.com/whoshuu/cpr
Мне сервер нужен, а curl как я понял клиент.
Вряд ли, это как просить книгу с описанием багов.
Разбирайся внимательно во всяких галочках и настройках в стороннем софте и либах, которые используешь. Многие появились не от хорошей жизни, и содержат в доках описание, как делать так, чтобы не поимели.
Что-нибудь типа такого приходит в голову
https://owasp.org/www-project-top-ten/OWASP_Top_Ten_2017/
А что опенжл сильно отличается от вулкан?
И разве в новых картах не будет опенжл?
Кроме того опенжл универсальней.
OpenGL будет везде, вулкан никаких профитов не имеет для домашнего хикки-программиста, а вот гемора с ним в разы больше
Знаю
Sublime, ну и всякое безумие типа простых редакторов.
Так же вопрос по настройке отладчика и компиляции, ибо последний раз после того как поставил Sublime и установил gcc всё равно ругался на отсутствие gcc.
Clion, qtcreator, Vscode
Как ты себе представляешь работу в конторе? Типа написал код нажал кнопку и оно запустилось?
Все равно никуда не денешься от билд систем.
По обрывкам - есть лид, который знает или свою ветку или вообще весь проест, есть те, кто задачи от лида выполняют.
Нельзя. Можно только учебник Борескова, и RedBook по OpenGL 4.5. На ангельском литературы не особо много, но она весьма годная.
Мимо пишу компутерную графику уже три года.[spoiler ]Задавайте ответы если интересно.[/spoiler]
Как гемора больше, она же должен был облегчить жизнь программистам, разве нет?
Он позволяет прогоаммистам управлять железом (память, вычисления на видяхе, вот это все) а не вызывать функции черного ящика, которых может и не быть.ж
Идея вулкана и ДХ12 - это суперпуперлоулевельное АПИ, которое должно помочь выжать больше ФПС на том же железе. Программировать его ощутимо сложнее
Понял
Типа C?
На радеонах ДХ12 лучше ДХ11. На нвидии наоборот.
с OpenCL никак, а с OpenGL очень даже.
Сегодня и графику и игры делают в специальных программах и на игровых движках.
На Питоне вообще нечего рисовать, это уж точно.
Успокойся аут, это была аналогия.
да нет впадлу мне питоны всякие учить
Вейленду уже больше десяти лет, а всё никак не прикрутят нормально хотя его по SSH нормально не передашь и не прорендеришь удалённо
IPv6 уже почти 25, а все сидим на четвёрке.
Некоторые стандарты очень долго переходят от бумаги к реальному пользователю.
Его можно просто в узких местах использовать, а в остальных будет OpenGL.
Не слушай этого долбаёба, в шапке есть прекрасные книги, которые можно прочитать. Именно КНИГИ, а не справочники. Справочники нет смысла читать в 2020, для вката достаточно книг,из шапки разумеется интернета и практики, а если справочная информация понадобится, то cppreference + другие источники - более чем достаточно.
Потому что не заставили. И так работает, никто не почешется.
>Неужели с плюсами ситуация не аналогичная?
Плюсы новый язык. Каждый год новый.
Осознайте это.
Наверное это неважно, но я спрошу. Там вроде http 1. Есть ли какая нибудь для меня разница между http 1 /1.1/2?
Ок
JS тоже, но там это не ощущается из-за сравнительной простоты.
Положи Qt5Widgetsd.dll рядом с бинарником, это отладочная версия Qt5Widgets.dll
Просто ты долбаёб, что в документации и ангельский не может.
Он должен считать, через сколько слов повторяется слово.
Но эта залупа в любом случае выводит максимум - 2!!!! пик 2
Я подозреваю, что дело в том, что ++number_of_words срабатывает лишь один раз - почему?
Лишние точки с запятой после while, после if. Поэтому, тело цикла выполняется один раз. Соблюдай кодстайл, и не будет такого говна.
Чел, методом тыка рандомно добавляя и убирая знаки препинания на с++ ничего не выйдет.
Потому что у тебя cin не кончается. Если можешь, въеби в консоль после своих слов символ конца файла, не знаю, какой он там на винде. Или лучше из файла читай, у него точно есть конец. Ещё можно getline, потом собрать istringstream. В общем, ебись, удачи.
Я бы порекомендовал сначала написать прогу, которая выводит слова, которые читает. Чтобы убедиться, что читаешь правильно.
Смешно.
Но видимо не может слинковаться, пишет error: undefined reference to `__imp__ZN8profiler5BlockC1EPKNS_19BaseBlockDescriptorEPKcb'
Как исправить проблему?
>>745413
Я бы хотел вкатиться в десктоп и парсинг различных сайтов. Ну и прикольно было бы всяких ботов делать, чтобы видео с ютуба качал. Я пробовал конечно в Java вкатиться, аж целых два года (но с работой в кол центре после рабочего дня ничего не хотелось, был выжат как лимон), но как-то не пошло, да и не мог с целью определиться. PHP - попробовав, сразу решил, что это не моё. Python - вроде норм, но я никак не могу привыкнуть к динамической типизации и вакансий нет в моем городе. Вот я думаю, все же в C++ идти или в C#. С одной стороны все в моих руках и без ограничений в креста, а с си шарпом...ну я хз, не могу привыкнуть к её философии, да и тоже самое, что Java, только с привязкой к майкам. Ну а кресты живее всех живых и вроде не надо городить огород при написании программ. Ну и мне всегда хотелось с указателями подробнее познакомиться и работать с ними.
В 2020 не стоит знакомиться и работать с указателями.
Что же касается парсинга, на шарпе ты напишешь его раз в 5 быстрее.
Но написать не проблема. вот собрать openssl - это другая история
Десктоп это электрон или шарп. Парсинг различных сайтов - питон.
В С++ вкатываться нет смысла, если ты не хочешь хардкорного системного пердолькинга.
Чет смотрел раст, столько дифирамбов, а по факту не очень радует - почитай раст тред свежий.
Приходит сисярпист в хаскель-тред и говорит: "А джава-то лучше"!
С++ тоже для борщехлебов. Ну или для некрофилов, которые копаются в легаси. Новые проекты, тем более крупные, тем более требовательные к безопасности, не пишут на С++, и уж тем более не пишут на С. Эти языки держатся на плаву исключительно из-за УЖЕ написаннного кода, который просто везде.
std::endl*
Inserts a newline character into the output sequence os and flushes it as if by calling os.put(os.widen('\n')) followed by os.flush(). (from en.cppreference.com)
То есть после \n ещё вызывается flush, как я понял.
Прямо АДОВЫЙ хуйлоуд - это редкость. Для 98% компаний тот же Го с удобными корутинами вполне себе быстрый, несмотря на наличие сборщика мусора.
FANG - 4 компании. У Фейсбука посещаемость - половина челевеческой популяции в месяц, про гугл вообще молчу.
Сколько таких компаний есть в мире? Можно пересчитать по пальцам одной руки. 98% других компаний предпочтут менее хардкорные и более безопасные языки, которые будут достаточно быстры для их потребностей. То бишь для компаний помельче те же Го/Раст гораздо лучше, чем С/С++, и экономически выгоднее.
Да пускай, я-то что? Я сам с/с++ червь, лол, и пишу почти всегда на них.
Просто объективно рассуждая, С/С++ очень слабо подходят на роль выбора языка для новых проектов, если у тебя не хуйлоуд уровня гугла. Более современные и безопасные инструменты подходят лучше в подавляющем большинстве случаев.
То, что Раст сложнее крестов - утверждение довольно-таки спорное.
Я вообще не шарю в cmake, но делаю так и у меня вроде работает:
add_subdirectory(path/to/myLib)
target_link_libraries(myProj mylib)
с этим согласен, но точно не обскурную парашу уровня раста выбирать. Тот же неткор - отличный, например.
текст с цпреференс не осилил
Короче, есть синие и красные функции, синие функции можно вызывать откуда угодно, а красные - только из красных.
FAANG же уже, 2к2о
Игры делают на крестах. То есть геймплей может и можно оствлять на скриптах, но в какой то момент все понимают, что нет, нельзя.
Видеоаналитикой занимаются на Си/крестах. То есть питонисты сидят и дрочат свои нейронки на питоне, да, нопотом это все должно гонять видеопоток в риалтайме, и легче всего (!) это делать на крестах.
Моделирование всякой научной личи - прототипчики на питоне/матлабе, потом кресты.
Опа, оказывается не двум процентам нужны кресты.
Я верю, что когда то кресты все таки должны будут уехать в дом престарелых, но Go явно пошел в другую сторону, а Rust пока стремный кузен какой то.
> Я верю, что когда то кресты все таки должны будут уехать в дом престарелых, но Go явно пошел в другую сторону, а Rust пока стремный кузен какой то.
Почему? В чем смысл отказываться от крестов? Ну было бы конечно неплохо если бы просто было бы какое то ответвление без кучи ебанутых поддержек совместимости с прошлыми версиями и построенное чуть более логично с учетом текущих разработок, а так че плохого в языке?
У тебя что, нет ощущения, что кресты это язык прошлого века? В том то вся и проблема, что нормально замены (пока) нет, но замена реально нужна.
В языке куча мусора и ни для кого это не секрет. При этом многопоточность местами выглядит дичайше. Функции не граждане первого сорта. Все пишут свои аллокаторы.
Язык создавался почти сорок лет назад - все уже стали умнее, можно напрячь извилины и все таки шагнуть вперед.
Ну я об этом и говорю, сделать кресты более современным языком, с учетом текущих недостатков, отказавшись от совместимости.
Ещё бы с метапрограммированием а-ля Circle
Хотя сейчас подумал над сказанным. Буст кажется на 11 версии плюсов, а уже 20 на подходе. Че с такими либами делать, если они используются часто? Паралельно содержать 2 версии языка с поддержкой совместимости и без? Звучит не очень
Ломать обратную совместимость - худшее, что можно сделать ВООБЩЕ.
только вот печаль, что никто не будет над этим заморачиваться, всем похуй( Эхх, а так хотелось бы, чтобы Раст стал новым глотком воздуха в мире этого старья из 70-80ых, но походу не судьба(
Мне сначала таким показался Go, но присмотревшись, понял, что нет и никогда им не будет.
Go не замена ни плюсам, ни тем более Си. Сложно назвать язык со сборщиком мусора системным (невозможно, это не системный яп, точка)
Кто-то всё равно пытается: https://www.linux.org.ru/news/opensource/14653611
Но там:
> немного модифицированный рантайм Go
лол.
Ну........ скорее да. Новый язык на основе старого
std::stoi, ты приводишь тип char к типу int и получается число (код символа), не равное цифре из строки
Компилятор лучше оптимизирует.
Постинкремент это {auto tmp=var; ++var; return tmp} что в нетривиальных случаях может быть очень грустно
А завтра там класс с копированием, вот никто и не хочет раскладывать себе мины.
Помогите, мне нужна таблица, которая хранит какие-то элементы, например пиксели struct {unsigned char red, green, blue}, чтобы к ним можно было обращаться по координатам table[x][y]. Я хуйни нагородил? Поймет ли крестовый компилятор, что мне по факту нужно просто data[ x + (y << p2) ] ? Сможет ли опустить все промежуточное? Может, где-то надо еще инлайны и ссылки добавить?
Закинь в godbolt и посмотри на ассемблер. Сравни с тем, что ты бы написал вместо этих двух операторов.
про флаги компилятора не забудь
>godbolt
У меня только objdump есть, братишь. Скомпилил с -O3, в main куча call и ни одного сдвига. Надо что-то инлайнить? Но что?
Выкинь оттуда всё, что связано с iostream, оставь только свой код и попробуй ещё раз
Ну и на godbolt можно посмотреть, какой кусок чему соответствует
Это сайт
Убрал все, как ты советовал. Сделал задаваемые с терминала координаты точки, которой присвоить значение, и опа, появился shl в main и с правильным значением, на двух вариантах ширины таблицы попробовал. ОНО РАБОТАЕТ! Может еще что по коду там выше скажешь? Заприватить конструктор Column, и сделать ему Table friend'ом?
Я могу тебе посоветовать только посмотреть похожие реализации, например из boost::gil или какого-нибудь eigen. Сам я таким байтоебством почти не занимаюсь.
Можно к этой картинке раст вставить, где прямая, ровная и безопасная дорога
У меня жопа горит с того что придется на бустасио с нуля писать, даже хочется go использовать
Не обязательно кста на бустасио, да.
Потому, что c=c+1 --> c+=1 --> c++, а не ++с
Или идиоматическое (✭q++ = ✭p++)
Даже дед Стауструп в книжке предпочитал for ( ... i++)
>>746568
Там uint, инкремент кодируется в одну команду.
В случае, где что-то создается (сложный объект + тупой компилятор), лучше писать ++с. И эта запись сигнализирует, что объект сложный, а оператор ++ не является командой инкремента. Когда запись передает способна передавать дополнительную семантическиую информацию, это хорошо. А повсеместное использование ++с отбрасывает такую информацию.
Если для интов нет разницы, как писать, ++i или i++, а для итераторов есть (как минимум, реализацию префиксного инкремента быстрее писать), не проще и удобнее ли всегда писать одинаково? На самом деле, все эти "временные объекты" хуйня, всё это прекрасно инлайнится и оптимизируется с вертухи. Я лично всегда выбираю префиксный инкремент как более элементарный и простой, и другим советую.
Вкатываться ли в программирование? Если мне 29, и я два раза ушел с универов, когда учился на программировании (не было интересно и не было понимания зачем это. но это было давно)
Во-первых, ты не в том треде.
Во-вторых
>не интересно
>нет понимания
Нахуя вкатываться то тогда? В твоём случае лучше пойти к врачу.
То, что ты за каким-то хуем решил поступить второй раз в универ уже многое говорит
> Или идиоматическое (✭q++ = ✭p++)
Дебс, это имеет совсем другой смысл.
Если ты тут напишешь преинремент, то копирование начнется со второго элема.
Спасибо.
Преобразуем указатель в intptr_t, пишем число в файл, читаем в том же процессе, преобразуем в указатель того же типа. Никакого UB, если объект не освобождался.
Как много нюансов. Спс.
Да
Таких нет. Погугли clang-format, там разные варианты есть. Я гугловский с некоторыми изменениями использую.
То есть такого, одного.
>блять чо ты делаешь блять
А мне нужно, чтобы было именно [x][y], а не [y][x]. Сейчас вот потестил на фильтре, который как на пике делает, со своим вариантом [y][x] типа твоего, который у меня уже был этого. Оказалось, скорость одинаковая.
BSD4Life
Я сам так не считаю, но довольно много тех, кто говорит про полную замену вулканом.
А они что-нибудь сложное на нём писали? Просто гл удобен и прост, а вулкан не очень.
Не знаю, у них аргумент, что это API предполагается использовать не напрямую, а с помощью движков, которые сами всё разрулят. Звучит убедительно, но ведь далеко не всем нужна трёхмерная графика исключительно для создания AAA-игор. Есть ведь куча научного и подобного софта, где те движки были бы слишком жирными, а использование вулкана слишком трудозатратно. Опенгл тут идеально подошёл бы в качестве апишки среднего уровня, ещё не движок, но уже не системщина.
Скорее всего всё не так плохо и это плотно нужно написать всего один раз и забыть про него.
Хотя программирование видеокарты - это говно уровня embedded
Что есть всё? Да, развиваться оно скорее всего не будет вообще. Но юзать ты его сможешь юзать сколько хочешь, оно же никуда не ходит. До тех пор, пока тебе не нужны хуанговские лучи и прочие нововведения - используй OpenGL и не парься.
Не будет развиваться, по-моему, и есть всё. Ну, не знаю. Время покажет.
Что-то похожее уже задевали в прошлых тредах.
И, если я не ошибаюсь, пришли к такому: прога использует что-то вроде косвенной адресации - то есть те адреса, которые ты можешь вывести на экран, это не прямой адрес в оперативе, а в какой-то виртуальный лист памяти, грубо говоря.
И сегодня у тебя нулевой адрес находится в одной части оперативы, а завтра в другой. Допустим, ты подсосался к памяти другой программы, сохранил в файл адрес переменной - в этом случае не получится уже читать с перезапуском из одного и того же места.
Но это все могут быть мои заблуждения из-за того, что я когда-то не понял дискуссию об этом.
Операционка теоретически не дает попасть в физические адреса чужого процесса, и тому процессу тоже не дает. Правда есть всякие хитровыебанные уязвимости типа spectre.
Доступ к любой памяти, которую ты специально не выделил - UB. А уж попал ты или не попал - без разницы. В адресное пространство другого процесса ты без ReadProcessMemory все равно не достучишься.
Кто-то ещё пишет на этом некроязыке???
Чот не уверен
А что так мало?
Зачем тебе, чтобы было [x][y]? Никаких преимуществ перед [y][x] абсолютно, только путает насчёт порядка доступа по индексам: соблазняет цикл внешний сделать по х, внутренний по у (привет кэшмиссы).
Скорость скоростью, но то, что я скинул, в первую очередь, читабельно и просто. Ну и точно быстрее, если тебе это важно. То, что ты там назамерял, ещё ни о чём не говорит.
Только тупорылые компании, тебе в таких будет не интересно, так что забей на некроязык и дай анонам поиграться с трупом.
На что ты надеешься? Тебе на рiтоне мало платят?
Можно же пойти на hh и посмотреть, что просят от того, кто хочет 30к. Учишь это - собеседуешься. В случае провала снова учишься, потом снова собеседуешься, и так пока не поймешь, что это не твое.
На piтоне я делал всякую хуебту на фрилансе для дрочащих мозг васянов с малым бизнесом, а теперь хочу вкатиться в тру язык и быть универсальным и востребованным.
>это не твое
С чего это?
>c++
>быть универсальным
Да, тогда действительнотлет 10-20.
>С чего это?
Твой заход начинается с вопроса "что нужно знать, чтобы зарабатывать 30к", и ты просто так почему то решил, что кресты это труЪ, универсально и востребованно.
А разве не так? На каком ещё языке можно завести и лоулевел чепуху и игровые движки с ядрами ос? А деньги так-то всем нужны, пиздец экономики грядёт.
Чел, просто грустно читать, честно. Движки и ОС как раз и дрочат "лоулевел чепуху".
От тебя было больше пользы если бы ты не грустил, а объяснил в чём я не прав и что с крестами не так для достижения моей цели.
>чём я не прав
>можно завести и лоулевел чепуху и игровые движки с ядрами ос? А деньги так-то всем нужны, пиздец экономики грядёт.
Вот тут ты и не прав, я вроде это уже написал.
>для достижения моей цели
Какая у тебя цель?
Зарабатывать 30к? Столько можно и в Пятёрочке. 150к? Столько и питонистом можно зарабатывать. Причём тут плюсы?
Быть востребованным? Востребованны 10x инжиры, а быдлокодеры нахуй никому не нужны, от них спасения нет. Язык при этом абсолютно не важен.
Так зачем ты пришёл в плюсовый тред, где парни угорают по ренжам и UB?
Попробуй Базовый курс Липпмана. Книга современная и внятная, но насколько подходит людям с проблемами в развитии не знаю.
Вот не обязательно. Оптимизатор выпиливает переменные, которые ты явно не использовал, и в результате, если и сработает, похерится что-нибудь другое. Но может с volatile и сработает.
Другой вопрос - если переменная используется явно, или объект вообще в куче...
Ну ты вспомнил. Срач о порядке индексов старше всех здесь присутствующих. Если бы на доске был фортран-тред..
Впрочем, никто не может запретить тебе индексировать хоть змейкой, хоть с единицы.
Что вспомнил? Ты математику в школе проходил? Тогда должен понимать.
х у школьников там всегда первый, а дальше детские привычки отходят на второй план, и делать начинаешь как надо, а не как учили.
Помню, как я делал в универе лабу на C++ Builder и жидко обосрался, когда пытался в виджет-таблицу записать матрицу, потому что у них, блеать, [x][y].
Я сам занимаюсь математикой, и могу вполне авторитетно сказать тебе пойти нахер с такими заявлениями.
Ты конченный.
Ну ты-то точно знаешь, что такое "заниматься математикой", икс-то у тебя всегда первый! Ты осознаёшь, фантазёр, что относиться к своим выдумкам как к реальности и хуярить на плюсах -- вещи немного несовместимые? Икс у него блять и игрек не в том порядке, да пошёл ты нахуй.
Как при умножении 100 на 0 получается не 100, а 0? А? Ученые, в говне моченые? Если я переложу 100 яблок из бочек А в пустую Бочку Б у меня не пропадут блядь яблоки все разом нахуй.
>Если когда-нибудь кто-нибудь ебался с матрицами
Ебался с матрицами в direct3d и в opengl, и сгорел нахуй от этих сраных математиков с их ебучими row-major и column-major, которые всё только запутали.
Мне похуй, как оно у них там в воображении делится на строки и колонки, мне надо только знать, какой элемент по счету в памяти куда попадёт.
Да, мы в говне мочёные, всё так.
Если серьёзно отвечать на мини-пасту про яблоки, то тут происходит подмена понятий с умножения как чисто математической хуйни на больную фантазию яблочного маньяка.
Жиза пиздец. Как я понял, row-major юзают, если базис левый, и наоборот. Вздумал же кто-то глубину глубиной назвать, и понеслось. Все нормальные люди правые тройки используют, а эти нитакие.
А вот как потом обратно по данным из файла создать объект? Еще раз, классы разные. Т.е. допустим первое слово в каждой строке - это название класса. Как зная название класса в string создать его инстанс в рантайме?
Если ты переложил яблоки из бочки А в бочку Б, то произошло вычитание, при чём тут умножение на 0?
Если тебе привезли пять бочек по 100 яблок в каждой, то у тебя 5х100 = 500 яблок.
Ты отдал 2 бочки Абу, 2 бочки Страуструпу и 1 бочку Степанову.
У Абу 200 яблок, у Страуструпа 200, у Степанова 100, а у тебя 100х0 = 0 яблок. Ты понял, куда их дел? Если нет, то не пользуйся умножением и не парься.
Если кто ебался с curses, там порядок (y, x)
Пока что кроме как if (str == "classname")... никак.
Но по идее ты должен знать заранее, что и как ты загружаешь.
Я не понял, уже середина 2020, а cmake всё ещё не поддерживает модули?
>Как зная название класса в string создать его инстанс в рантайме?
Погугли реализации фабрик в с++.
В целом всё, конечно, сводится к if (name == "..."), но можно при желании нагородить систему, в которой классы будут регистрировать себя, а макросами и шаблонами сделать так, чтобы это было одной строчкой в объявлении класса.
А ты чего?
Плюсую. Нужна фабрика, а if можно убрать только сделав имя шаблонным параметром, но, насколько я понимаю, тогда их все нужно проинстанциировать заранее.
Умножение на 0 означает что у тебя спиздили бочку, вместе со всеми яблоками.
Ему хочется, чтобы х был первый, у него нет в этом необходимости.
С копейками и рублями немного неточное сравнение. Оно будет более точным, если ценник, в котором поменяли порядок, будет понятнее обычного в десять раз, и покупатель будет тупить на кассе в два раза меньше. Да, кому-то копейки вперёд рублей видеть непривычно, но если это со стороны реализации более естественно, какая тебе разница? Неужели это оправдывает вставку непонятных костылей и уродование кода?
>>748520
Я дальше стал экспериментировать. Сделал 4 класса таблицы у котороых [x][y], [y][x], умножение и замена умножения сдвигом (длина строки - степень двойки и дополняется пустыми). Компилил с -O3 на g++ и clang++. Из замеров вмерени исключены всякие резервирования памяти. Тут-то оказалось, что умножение быстрее сдвига! Смотрю в таблицу операций по таймингу
https://www.agner.org/optimize/instruction_tables.pdf
и быть так не должно!
Тогда я решил проверить на несколько отличном от пеки девайсе - Raspberry Pi B+. Одно и то же - умножение быстрее! С поправкой на частоту процессора, конечно. Теперь для окончательного решения сдвиго/умножительного вопроса придется писать на асемблере, благо там алгоритм не сложный.
Ты ебанутый что ли?
Представь себе какое нибудь использование в реале
get_mouse_pos(&x, &y);
get_pixel(x, y);
c = do_vasyan_calc[y][x];
set_pixel(x, y, c);
Удачи ловить баги, просто потому что у тебя АПИ ебанутое потому что ты не представляешь как записать по другому.
Замеры производительности -- довольно тяжёлое занятие. Сам я ориентируюсь на собственные ощущения того, что сколько стоит. В твоей ситуации, я полагаю, всё упирается не в количество тактов на инструкцию, а банально в скорость доступа к памяти, причём разница по скорости между исполнением инструкций и хождению по памяти -- полтора-два порядка. На самом деле не важно, что там у тебя, [x][y] или [y][x], это вопрос простоты реализации и договорённостей между программистами. Важно, чтобы данные обходились в порядке, в котором они лежат в памяти, чтобы процессору удобно было заливать данные из RAM в кэш. Если добавляешь дыры промеж строк, кэширование отрабатывает хуже. Можешь попробовать сделать бенчмарк со случайным характером доступа к памяти, там производительность просядет огого как.
>Замеры производительности -- довольно тяжёлое занятие.
Я беру самый железобетонный способ. Вот - обсчитать массив пикселей, и не просто последовательно, а там беготня в хаотических направлениях по пикселям. Замеряю все время обсчета.
>В твоей ситуации, я полагаю, всё упирается не в количество тактов на инструкцию
Не знаю уж чего там наоптимизировал компилер, но в нужном месте кода на крестах всего лишь разница - умножение или сдвиг. И разница на всей обработке процентов 75 и на x64, и на arm. Буду делать на асме без хаков, чтобы посмотреть.
>>748009
>Зачем тебе, чтобы было [x][y]? Никаких преимуществ перед [y][x] абсолютно, только путает
>>748157
>х у школьников там всегда первый
>>748158
>>Потому что x всегда идет первым.
>нет
>>748567
>С копейками и рублями немного неточное сравнение. Оно будет более точным, если ценник, в котором поменяли порядок, будет понятнее обычного в десять раз
Собственно, почему захотел X вперед Y. Пример, функция рисования прямоугольника на WINAPI (и куча подобных функций других API):
BOOL Rectangle(
HDC hdc,
int left,
int top,
int right,
int bottom
);
Сперва X, потом Y.
А представьте себе функцию, рисующую прямоугольный фрагмент первой картинки в прямоугольный регион второй с ресайзом:
drawScaled(src_table, dst_table, src_x0, src_y0, src_x1, src_y1, dst_x0, dst_y0, dst_x1, dst_y1);
У меня лично глаза на лоб полезут, если иксы с игреками местами поменять.
>Замеры производительности -- довольно тяжёлое занятие.
Я беру самый железобетонный способ. Вот - обсчитать массив пикселей, и не просто последовательно, а там беготня в хаотических направлениях по пикселям. Замеряю все время обсчета.
>В твоей ситуации, я полагаю, всё упирается не в количество тактов на инструкцию
Не знаю уж чего там наоптимизировал компилер, но в нужном месте кода на крестах всего лишь разница - умножение или сдвиг. И разница на всей обработке процентов 75 и на x64, и на arm. Буду делать на асме без хаков, чтобы посмотреть.
>>748009
>Зачем тебе, чтобы было [x][y]? Никаких преимуществ перед [y][x] абсолютно, только путает
>>748157
>х у школьников там всегда первый
>>748158
>>Потому что x всегда идет первым.
>нет
>>748567
>С копейками и рублями немного неточное сравнение. Оно будет более точным, если ценник, в котором поменяли порядок, будет понятнее обычного в десять раз
Собственно, почему захотел X вперед Y. Пример, функция рисования прямоугольника на WINAPI (и куча подобных функций других API):
BOOL Rectangle(
HDC hdc,
int left,
int top,
int right,
int bottom
);
Сперва X, потом Y.
А представьте себе функцию, рисующую прямоугольный фрагмент первой картинки в прямоугольный регион второй с ресайзом:
drawScaled(src_table, dst_table, src_x0, src_y0, src_x1, src_y1, dst_x0, dst_y0, dst_x1, dst_y1);
У меня лично глаза на лоб полезут, если иксы с игреками местами поменять.
> Сперва X, потом Y.
Вот и правильно. Абсолютно все библиотеки так делают, анону тоже так нужно делать. А если где-то всё-таки не так, то лучше написать обёртку.
Разница ведь не только в умножении и сдвигах, но и в устройстве памяти. Я думаю, разница из-за добавления пустых мест. Вполне может не влезть всё в кэш. Ты на разных размерах массива тестил? На малых, на больших? Чтобы всё в кэш влезло, чтобы ничего не влезло, что-то среднее, и так далее.
>>748632
Да делайте обёрток сколько хотите. Но в итоге, в первую очередь доступ идёт по строке, по у-координате. Если хотите забыть, что там под слоями абстракций -- пожалуйста, но производительность так проебать проще простого. Дизайн кода не должен забывать об особенностях реализации, и, по-хорошему, должен о них напоминать.
> разница по скорости между исполнением инструкций и хождению по памяти -- полтора-два порядка
Из памяти нормальные задержки - 20 тактов. При том что современные процы за такт 2-4 инструкции могут выполнить. Но это всё хуйня, если юзается SIMD и правильное кеширование с нормальным выравниванием памяти. Там уже из стека будет сосать вполне со скоростью выполнения кода, особенно если переходы/арифметика. Алсо компилятор не волшебник, если говнокодить, то он не сможет ничего сделать с говнокодом.
>>748632
> Вот и правильно.
Это надо смотреть как обход по пикселям идёт. Чтоб не шагать поперёк линий.
20 тактов -- это доступ в L2? Это ещё надо префетчер ублажить, чтоб так всё приятно оказалось. В любом случае, там абсолютно не важно, умножает он или сдвигает для индексации, в его ситуации это вообще на производительность не влияет.
>Разница ведь не только в умножении и сдвигах, но и в устройстве памяти.
Так и предполагаю, в принципе, что при использовании сдвига вместо умножения в кэш грузятся бесполезные данные. Скорее всего ,в этом дело. Тестил на одной картинке пикрелейтед.
Да, всё примерно так и происходит. Потести на картинках разных размеров, станет понятнее.
Ойбля, а у нее ширина 1024, степерь двойки, паддинга мусором в строках пикселей вообще нет. Короче, как заассемблю это все, отпишусь.
Бля, действительно. Могу тебе с этой хуйнёй только посочувствовать. Удачи.
> это доступ в L2?
Напрямую в ОЗУ. Если память выровнена по блокам кеша, то проц весь блок кеширует в L1 при обращении в начало блока, при последовательном чтении сильно быстрее будет. Опять же, можно в AVX-регистры тянуть данные, будет быстрее чем по 64 бита в RAX и ждать задержку. Компиляторы обычно такое не делают, у них максимальная совместимость с некроамудой.
А я думал, что напрямую в хорошую современную RAM сходить стоит 50нс. Я правильно понимаю, что при частоте 4ГГц, время такта равно 0.25нс? Тогда поход в некэшированную память -- 200 тактов. Но это при произвольном доступе будет, с данными, не помещающимися в кэш, а не при последовательном. Кстати, блок -- это сколько? Зависит от проца? Так-то довольно логично получается, заебись, спасибо.
Сразу понятно, что ты сложнее laba2.cpp ничего не писал
С++/STL можешь еще QT добавить.
мы в Нвидии за 600кк\нс пишем
А они где-нибудь уже норм поддерживаются?
>Неужели это оправдывает вставку непонятных костылей и уродование кода?
Юзабилити всегда важнее красоты кода.
Нужно уметь пользоваться сайтами с вакансиями, где пишут требования к кандидатам.
> интернет говорит что по мск средняя 70к
Я бы за такие деньги не пошёл даже джуном пинать хуи. Мало того что кодинг сам по себе рабская работа, так ещё и платят меньше чем админам без опыта.
да это хуйня полная, думаю. Поэтому и хочу узнать у КОМЮНИТИ
Что выбрать - сабж или питон.
Раст не сложнее. У крестов будущего нет. Раст безопаснее их и не тащит груз обратной совместимости длиной в 30 лет.
Хуйню несешь.
тебя послушай, так он вообще нахуй не нужен
везде, где есть железо и взаимодейсвтие с ним нужен с++ - те же ебучие беспилотники яндекса. Давай, ебани на расте пойди обработку данных с лидара
Ссылка прибивается гвоздями один раз - ее нельзя не проинициализировать, нельзя поменять на другой объект, нельзя присвоить nullptr, нельзя сделать ссылку на ссылку, нельзя складывать ссылку с ссылкой.
Спасибо
Ок, спасибо.
в сигнатуре 99% функций
Пытаюсь собрать QtHttpServer https://www.qt.io/blog/2019/01/25/introducing-qt-http-server
Получаю пикрилейтед.
Qt 5.9.5.
Пытался найти документацию по QtPrivate, чёт вообще ничего нет. Как править?
Лично мне удобно очень использовать их в параметрах функций, когда нужно передать объект, а не копию, но не хочется использовать синтаксис указателей.
До параметров функций я еще не дошел
До тех пор, пока тебе не понадобилось обеспечить корректность его исполнения, или, что ещё хуже, поправить там чего-нибудь. Хороший код выглядит просто и читается просто, а такое месиво, как у того анона, это невозможно ни прочитать, ни поддерживать. А юзабилити эту твою я смогу обёрточкой накинуть всегда, если меня будут просить такие вот, как ты.
>>748822
А, это ты cacheline так хитро назвал. Тогда я нихуя нового не узнал, а ты не объяснил, почему при последовательном доступе всё работает гораздо быстрее, чем при случайном. Как я понимаю, за счёт вот этого механизма происходит вся магия: https://en.wikipedia.org/wiki/Cache_prefetching
> почему при последовательном доступе всё работает гораздо быстрее, чем при случайном
Потому что при обращении в начало выровненного блока кешируется весь блок и последующие данные берутся из кеша. Сколько раз тебе надо это повторить? У тебя только каждые 64 байта идёт прямой запрос данных из памяти. А если ты читаешь случайные данные, то ничего не кешируется в принципе, каждый раз ждешь задержку.
Ещё почитай про throughput и как правильно разбивать цепочки инструкций для одновременного выполнения некоторых инструкций, что может помочь в чтении случайных данных.
Антош, ну не расстраивай меня пожалуйста
Сегодня в 21:00 по МСК
Не перекатишь - отсосёшь.
И сколько времени нужно с 0 чтобы выучиться до уровня джуна/стажера?
1 год 4 месяца 24 дня 11 часов 13 минут 63 секунды
чел, что ты ожидал услышать, всё от тебя зависит: куда вкатываться собираешься, сколько времени будешь тратить, как качественно ты учишься и тды
По твоей логике, если я работаю с выровненными данными размером 64 байта, я не увижу разницы между последовательным и произвольным доступом? Ведь тогда каждый доступ по памяти влечёт хождение в RAM.
от полугода до бесконечности
Скорее ты, он же все правильно написал.
> если я работаю с выровненными данными размером 64 байта
> я не увижу разницы между последовательным и произвольным доступом
Давай ещё раз. Для тупых.
Когда у тебя выровнена память по 64 байта и ты читаешь последовательно - у тебя после первого чтения остальные данные из блока в 64 байта берутся из кеша.
Когда у тебя произвольное чтение - каждое следующее обращение промахивается мимо кешированного блока и равно отсутствию какого-либо кеша.
>Давай ещё раз. Для тупых.
Давай.
>данными размером 64 байта
Какие
>остальные данные из блока в 64 байта берутся из кеша.
Если он уже все 64 байта прочитал?
Я тогда тебе охуенный вопрос задам: а как проц определяет, какое чтение произвольное, а какое нет? Ты, наверное, удивишься, но никак. Поэтому прочитанное из RAM подымается наверх до L1 вне зависимости от того, какой у чтения характер, произвольный или последовательный. А вот хардверный префетчер (и софтверный, если есть) как раз следит за характером чтения, и если оно становится похоже на последовательное, то он начинает заливать данные из памяти в кэш ещё до того, как память понадобится. Именно за счёт этого получается быстро, а не из-за простого факта существования кэш-линии.
А, я ещё пару раз перечитал твой пост и понял, что ты не понял. Я о случае, когда меня интересует вся кэш-линия, полностью. В таком случае, какой прок от твоего кэширования?
> Если он уже все 64 байта прочитал?
Как он тебе их прочитает за раз? У тебя 8 операций чтения будет, либо если SIMD используется, то инструкции SSE/AVX довольно медленные. Пока читаются эти 64 байта, в другом порте идет обращение к следующему блоку и его кеширование. Ты же не просто перемещаешь данные, а что-то с ними делаешь. Это с копированием ты в любом случае упираешься в ОЗУ.
>>749657
> как раз следит за характером чтения, и если оно становится похоже на последовательное
Для таких случаев есть документация по архитектуре от вендоров, где тебе пишут как надо обращаться в память чтоб было быстро. Это тебе надо следить чтоб оно было последовательным, а не процу ванговать что в следующей инструкции ты соизволишь читать.
Так, подожди, не путай. Я говорю не об одновременном чтении. Я говорю о том, что мне нужна вся кэш-линия, ровно 64 байта. Ты заострял внимание на эффекте, порождаемом бесполезностью части кэш-линии при случайном чтении, если она мне нужна вся, я привёл пример, когда этот эффект обнуляется.
Ты писал, что "блок" улетает в кэш ровно при обращении в его начало, а теперь пишешь, что где-то там до обращения к следующему "блоку", тот кэшируется вместе с ним. Я не могу понять, ты виляешь жопой, или просто не можешь чётко выразить мысль?
> при случайном чтении
У тебя случайное чтение в пределах 64 байт?
> "блок" улетает в кэш ровно при обращении в его начало, а теперь пишешь, что где-то там до обращения к следующему "блоку"
Алло, блять. Инструкции не обязаны и не должны строго по порядку исполняться. Обращение в начало следующего блока может и должно быть до того как кончится текущий, за этим должны следить кодеры компилятор.
Мне теперь тебе всю работу процессора объяснять, чтоб каждый пост ты не находил что-то новое и не начинал удивляться как же это так?
> не можешь чётко выразить мысль?
Это у тебя какие-то проблемы с пониманием как работает кеш.
> в другом порте идет обращение к следующему блоку и его кеширование
Что тебе тут не понятно? Почему следующий блок кешируется до того как в нём появляется необходимость или что?
> Я сдаюсь.
Молодец. Зачем вообще тогда пытался разобраться, если даже не стараешься?
Хотя если вместо чтения документации ты фантазируешь в треде, то наверное тебе и не сильно надо было.
Не обращай на него внимания, какой то трал или шизик.
>Ссылка прибивается гвоздями один раз - ее нельзя не проинициализировать, нельзя поменять на другой объект
int i = 0;
int& ri = i;
::new(&i) int{}; // ri ссылается теперь на другой объект
https://habr.com/ru/post/480608/
Там в комментах срач хороший. tldr - SIMD инструкции можно дергать хоть из питона через Numpy, результат будет очень близок
Спасиюо
Ну в клепание формочек на QT за полгода-год вкатиться еще можно. Если что-то более серьезное, то больше года.
>SIMD инструкции можно дергать хоть из питона через Numpy, результат будет очень близок
А, сорян вот, дернуть-то я и письку могу. Их можно дергать из pitona, чтобы нечто типа fftw3 получилось?
Напрямую из питона нет. Но из питона через сишную прослойку (в нашем случае как раз Numpy, как пример) - да
Внутри numpy есть проверки на cpuid и использование SIMD для ускорения различных операций, если оно поддерживается.
Сделай, кто тебе мешает. Вопрос использовать ли SIMD под капотом ты решаешь для себя сам.
То есть Python в данном случае лишь клей. Только в таком смысле и имеет смысл его обсуждать, хорошой ли он клей для блоков более быстрых алгоритмов. Как зашить питоний проект в одну экзешку? Да никак, только распаковать скрипты в %temp%, других вариантов не существует.
В данном случае типа int, верно.
Нет.
По идее ему нужно явно в second.cpp написать что-то вроде using A<float>, чтобы он знал что используется float и скомпилировал функции с флоатом - но что-то я не могу нагуглить каким образом это можно указать.
Тебе нужно ещё явно инстанцировать шаблон для тех типов, с которыми работать будешь.
Ты почти угадал. Просто не using, а template
https://stackoverflow.com/questions/2351148/explicit-template-instantiation-when-is-it-used
Мур, благодарю.
Потому-что надо знать С++, неправильный С++ (например то, как QT манажит память), и еще сам Qt сверху.
Я слышал что from_chars люто оптимизировали на скорость. Но это, наверное, больше к флоатам относится.
Я пытался почитать сумму цифр в string, что сути не меняет. Сделал потом как на пикриле, но по началу не очень принимал эту идею. Это будет во всех кодировках норм работать? Есть ли кодировки где цифры не подряд идут?
https://en.cppreference.com/w/cpp/compiler_support
С 8 версии есть Elementary string conversions
Нет, разделители и точки не учитываются.
Я пишу for в котором меняю картинку, затем thread::sleep_for(2s), поток спит, но изменение картинки, вызванное ранее, не срабатывает
Компилятор как-то пытается оптимизировать мой код и решает один раз поменять картинку вместо n?
Для такой хуйни придумали QTimer
Это пиздец, я ебался с лямбдами и stoi, когда можно было просто boost::lexical_cast заюзать. Будем верить что в 20 стандарте завезут.
18-20 и 31-33 строчки.
Я использую P-R.
Я думаю, бенчмарк о том, что from_chars явно сколько-нибудь быстрее, чем stoi. Непонятно, насколько, но быстрее, и именно это и хотелось показать. Правда, непонятно, лежит ли эта разница в пределах "погрешности измерения".
Мне похуй что интересует "вас", при изменении Q один из них как будет быстрее, так и останется.
>Это надо смотреть как обход по пикселям идёт. Чтоб не шагать поперёк линий.
https://ideone.com/0A4SZZ
Какой все же вредный этот ваш кэш. А если мне надо побегать вокруг пикселя относительно хаотически в некотором радиусе? Ну, допустим, побью я картинку на квадратные тайлы, при первом обращении буду запрашивать [0][0] пиксель тайла, чтобы весь квадрат зэкэшился. Конкретный размер квадрата надо смотреть из параметров конкретного процессора? А как?
QT это гигантская обоссаная абстракция, внутрь лазить - ну спорно.
А вообще статьи на kdab.com и https://www.bogotobogo.com
У практически всех процессоров, на которых твой код может запуститься, длина cache line -- 64 байта. Кстати, необязательно запрашивать [0][0] пиксель тайла, тот анон просто шиз. У тебя при доступе к любой памяти в кэш улетает 64 байта, в которых она содержится.
Хорошая статейка про наблюдаемые эффекты кэширования: http://igoro.com/archive/gallery-of-processor-cache-effects/
Че ряльна?
Элементарное свинае делаешь и всё
template <class OneByte>
std::enable_if_t<(sizeof(OneByte) == 1),void> foo() {
}
в апи при регистрации окна в поле соответствующей структуры записывается указатель на процедуру-обработчик
в своем классе-обертке мне надо бы туда скормить лямбду которая захватила this
но стейтфул лямбды к указателю не приводится
есть ли способ это как-нибудь обойти может передать указатель на оператор () у лямбды или типа того?
Сделай структуру, в которой будет лежать std::function, и на эту структуру передавай указатель.
Можно просто f(T(&a)[n]).
Тупая скриптомакака подтвердила свою тупость. Привет из 118 треда.
Это копия, сохраненная 31 декабря 2020 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.