Нашли или выдавили из себя код, который нельзя назвать нормальным,
на который без улыбки не взглянешь?
Не торопитесь его удалять или рефакторить, — запостите его на
говнокод.ру, посмеёмся вместе!
Game::Game()
{
run = true;//флаг признак нажатия кнопки выхода F5
Matrix = new int* [8];//Поле 64 ячейки - значения 0 - для пустой ячейки, для игрока каждая пешка-шашка от 1 до 9, для компьютера значения в матрице от 10 до 18
for (int i = 0; i < 8; i++)
Matrix[i] = new int[8];
//Квадраты координат нужны чтобы программа знала какие ячейки над указателем мыши, 64 квадрата
QuadCoorXleft = new int* [8];//каждой ячейки матрицы Matrix соответстует квадрат координат для мыши xleft означает левую координату x
QuadCoorXright = new int* [8];//xright - правая x
QuadCoorYdown = new int* [8];//верхняя y координата
QuadCoorYup = new int* [8];//нижняя y координата
for (int i = 0; i < 8; i++)
{
QuadCoorXleft[i] = new int[8];
QuadCoorXright[i] = new int[8];
QuadCoorYdown[i] = new int[8];
QuadCoorYup[i] = new int[8];
}
//Координаты пешек для отрисовки
ChessX = new double[18];//X
ChessY = new double[18];//Y
//Выделяемая пешка ее координаты и значения
ActiveX = -1;//X
ActiveY = -1;//Y
Active = -1;//Value
firstplayer = true;//флаг того что можете игрок 1й ходить
secondplayer = false;//флаг того что можете игрок 2й ходить
ai = new bool[18];//ячейки флаги того что пешка на финишной позиции
chessai tmp;
for (int i = 0; i < 18; i++)
{
ai[i] = false;
if (i > 8)
{
tmp.ai = ai[i];
tmp.value = i+1;
Ai.push_back(tmp);//Вектор с флагами финиша каждой пешки для искуственного интеллекта
}
}
aicountfirstrow = 0;//счетчик кол-ва пешек ИИ(искуственного интеллекта) на верхней строчке(0-я)
aicountsecondrow = 0;//счетчик кол-ва пешек ИИ на предверхней строчке(1-я)
aicountthirdrow = 0;//счетчик кол-ва пешек ИИ на предпредверхней строчке(2-я)
}
> Где-то более года назад мне пришлось делать одно тестовое задание чтобы устроится на работу. Выполнил я его в срок, но конкуренция была большая и скорее всего взяли человека который сделал его с помощью рекомендованных технологий и красочнее.
(╥﹏╥)
Надеюсь, он эти координаты хоть не сравнивает. А то потом получится, что две пешки на одной клетке рисуются, а ChessX[Passive-1] != ChessX[Active-1]. // 0.200000000001
«Вашим следующим шагом должно быть либо удаление этой статьи, либо вторая часть: работа над ошибками. В ней Вы должны рассказать нам (а не мы Вам), почему Вас не взяли и как Вы исправили бы свой код, чтобы стать лучше»
Главное отличие хабра от говнокода. Не в пользу хабра.
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
и еще одну... причем сразу про source nat и про mysql_real_connect и про ООП https://habr.com/ru/post/461503/
можно еще про vectordrum пошутить, но я не буду
В общем, для своего приложения я выбрал mysql и посмотрел что есть на Linux. Там уже был установлен он, но пароль никто не знает, а те кто знали забыли (те кто работал до меня). Узнав что он никому не нужен, я его удалил и попытался установить заново. Память не хватало и поскольку чтобы исправить эту ошибку пришлось бы подключать к нему монитор и клавиатуру с мышью, я решил бросить это дело
А вот тут https://habr.com/ru/post/520400/
автор показывает, что бывает, если накопипастить разные строчки с разных мест часть на си, часть на плюсах)
newsockfd = new int[maxclients];
thread = (HANDLE*)malloc(sizeof(HANDLE) * maxclients);
args = new struct arg_sa[maxclients];
///
unsigned long long id;
std::vector<uint64_t>* plaintext = new std::vector<uint64_t>();
///
#define ROL(x,n,xsize)((x<<n)|(x>>(xsize-n)))
#define RKEY(r)((ROR(K,r*3,size64*8))&F32)
const uint64_t K = 0x96EA704CFB1CF671;//ключ шифрования
там еще много прекрасного, вроде такго
>Вкратце в вечном цикле создаются потоки для каждого клиента и ждут accept
сама задача такая: автор не знал, что в активном режиме FTP не работает за NATом, и "Не найдя ответа на куче форумов" решил написать свой сервер и клиент на винсок, а за одно и реализовать шифрование (про TLS автор не знает)
для полноты картины нужно хранить в векторе указатели на int
ну хотя да: автор думает, что векторы всегда нужно создавать через new.
вообще по какому приниципу он выбирает место для хранения не очень понятно. Кажется, что если код напоминает ему C++, то он делает new, а иначе автоматическую (или статическую) перерменную
Ну стэк вообще-то не бесконечный, чтобы на нём указатели на вектора хранить:)
Если без зеленого, то вектор же хранит свои данные в алокаторе (вероятнее всего в куче), а на стеке там только такая куржопенькая ручка из трёх указателей (или двух указателей и размера?) (потому вектор обычно sizeof 24, но не обязан)
Ой, я оговорился: не на куче, а на стеке. Конечно же, трудностей в выделении вектора (вернее, его элементов) в куче нет. Но если это дефолтный способ занять память, то в эмбеддеде его уже не используешь. Наверное, j123123 поэтому ненавидит «С++».
Кстати, а как тебе языки с возможностью шаманить с аллокаторами? Типа «Odin».
а ты уверен, что тебе нужен std::vector - контейнер, который способен динамически менять свой размер при жизни, который аллоцирует обычно с запасом, т.к. позволяет вставлять новые элементы в т.ч. в середину - а не std::array?
j123123 ненавидит С++, потому что не смог, вот и бесится
Степанов (или кто там делал STL) прекрасно знал, какие сишники байтоебы, и понимал, что если не дать им возможность контролировать выделение памяти для контейнеов, то они ими ни в жизни пользоваться не будут, а навелосипедят рядом свое, потому что "а зачем мне лишний brk"
Потому что realloc() — это образцово-показательный пример говна, образовавшегося из-за нярушения SRP.
Вызов realloc(), в силу своей говённости, ня позволяет детерминированно контролировать, будет ли диапазон памяти просто расширен или скопирован в новую область. Это, в свою очередь, ня позволило добавить универсальную функцию realloc() в аллокаторы, и как следствие — распространённые реализации контейнеров ня используют realloc().
Кстати, очень удивлён был, что нет функции вроде max_expand_size, которая бы вернула максимальный размер до которого realloc расширяется на месте. Заткнуло бы большинство проблем.
> Вызов realloc(), в силу своей говённости, ня позволяет детерминированно контролировать, будет ли диапазон памяти просто расширен или скопирован в новую область.
А в чем проблема? Для этого достаточно сравнивать указатель до и после realloc.
Если вместо malloc() делать new() - копирования хуйни - delete(), мы разве лучше что-то контролируем?
В том, что таким способом о копировании ты узнаешь после, собственно, копирования. А в общем случае копировать объекты через memcpy(), как делает это говноrealloc(), няльзя.
> В том, что таким способом о копировании ты узнаешь после, собственно, копирования.
Почему меня это должно волновать? Вот конкретно для кейса, когда я делаю push_back в вектор, какая мне разница, откопируется ли оно при realloc или останется на месте? Я уж не говорю о том, что никакого фактического копирования может и не происходить, учитывая что есть MMU
Каким образом вариант "всегда выделяем новую память и копируем хуйню из старой в новую, а старую освобождаем" оказывается лучше?
Потому что слишком много работы (как для стандартизаторов, так и для авторов стандартных либ/компиляторов) ради минимального прироста производительности в редких случаях, который ещё и в някоторых случаях приведёт к деградации (когда система ня поддерживает быстрый realloc, няпример).
Кстати да, вполне можно сделать и особый вариант realloc(), например realloc_if_ptr_will_be_same() который бы успешно расширял память, если это возможно при неизменении указателя (т.е. если можно довыделить страниц сзади), но который бы нихуя не делал при невозможности такого расширения. Такой вариант realloc-а крестовики бы стали запихивать в свои аллокаторы?
Да, стали бы (примерня такой пропозал и есть по ссылке дяди Ди выше). Но проблема остаётся той же: это нужня только для няскольких редких кейсов, это сложня реализовывать, это приведёт к деградации (лишние рантайм-проверки) для случаев, когда довыделять страниц няльзя.
Собственно, если в твоём приложении реаллоцирование вектора с тривиальня-копируемыми объектами является бутылочным горлышком, то всегда можня взять другую либу, няпример, https://github.com/facebook/folly/blob/master/folly/docs/FBVector.md . Стандартные контейнеры — ня червонцы, всем и во всех случаях нрявиться не могут.
Ня винде анялогов mremap() нят. Там realloc() можня сделать только ручным юзермодным костылянием, что, конячно, по эффективности будет у GNU/Linux отсасывать.
Реаллочить кококококтейнеры в общем случае нельзя, потому что в крестах (в отличие от няшки) бывают не тривиальные объекты, которые нельзя скокококококпировать просто так
Можно было изъябнуца и сделать ооооптимизации, но всем опхуй
HeapCreate/HeapAlloc/HeapReAlloc — это и есть "можня сделать только ручным юзермодным костылянием". Эти функции работают поверх выделенного через VirtualAlloc блока, организуя в нём кучу исключительня юзермодными операциями, без помощи ядра/процессора.
Это верня: хипы это абстракции поверх VirtualAllocкнутой хуиты
Интересно было бы няписать статью со сравнением работы виртуальной памяти прыщей и винды, и вообще серию статей со сравнением подсистем (tty vs ConsoleAPI итд)
Аллокаторы в С++ несколько неудобны. У них есть параметр — тип объекта, поэтому, казалось бы, ты можешь оптимизировать своё говно под конкретный тип и хранить только его? Но хуй! Твой аллокатор должен поддерживать произвольные типы, потому что половина сущностей в стандартной библиотеке хранит ни хера ни T, а какой-нибудь _No__de<T> ([forward_]list, [multi]set/map, shared_ptr...). В общем, я за кастомный memory_resource с доступом через polymorphic_allocator.
> потому что половина сущностей в стандартной библиотеке хранит ни хера ни T, а какой-нибудь _No__de<T>
А как иняче-то сделать неинтрузивные list, set/map, shared_ptr? Тебе в любом случае придётся выделять "struct Node {Node *next; T value; }" для списка, "struct Node {Node *left, *right; T value; }" для сета/мапы и так далее.
Некоторые вещи, которые есть в этом коде, нельзя писать даже в прототипе. Их вообще нигде нельзя писать, их нельзя ничем оправдать — не существует случая, когда они хороши.
Matrix[i] = new int[8];
//Квадраты координат нужны чтобы программа знала какие ячейки над указателем мыши, 64 квадрата
QuadCoorXleft = new int* [8];//каждой ячейки матрицы Matrix соответстует квадрат координат для мыши xleft означает левую координату x
QuadCoorXright = new int* [8];//xright - правая x
QuadCoorYdown = new int* [8];//верхняя y координата
QuadCoorYup = new int* [8];//нижняя y координата
А что бы ты сделал, если у тебя в ряду есть N и N+90000, а остальное ноли? Сделал бы связспиок с указанием сколько нолей до следующего элемента?
Иными словами как пропустить ряды я понял, а как бы ты пропустил колонку?
>Да, но внутри то у него эти new никуда не денутся.
хотябы снаружи не выглядело бы как грязь
Matrix[i] = new int[8];
//Квадраты координат нужны чтобы программа знала какие ячейки над указателем мыши, 64 квадрата
QuadCoorXleft = new int* [8];//каждой ячейки матрицы Matrix соответстует квадрат координат для мыши xleft означает левую координату x
QuadCoorXright = new int* [8];//xright - правая x
QuadCoorYdown = new int* [8];//верхняя y координата
QuadCoorYup = new int* [8];//нижняя y координата
В общем тут вполне себе известный заранее, не разреженный и не очень большой массив какого-то говна, который не понятно зачем так сделан
> как пропустить ряды я понял, а как бы ты пропустил колонку
Нужно больше индирекций! На первом слое пусть будут условно блоки по 10000 строк и 10000 колонок. На втором -- внутри них блоки по 100. На третьем -- собственно сами значения.
Я эту структуру хотела юзать чтобы карту для ММОРПГ хранить (зоны вокруг игроков префетчятся в память, остальные уходят спать на диск). Поэтому она действительно очень близка к пейджтейблам.
Обычный mmap тут не совсем подходил т.к. там куча вещей переменной длины и нужно было freeze/thaw обрабатывать явно.
звучит так, словно ты руками решил сделать работу за диспетчера виртуальной памяти
Нельзя было никак сделать свое "хранилище" из блоков размером в страницу, и как-то всё это туда упаковывать (ну переменной длинны, но можно же как-то всунуть?), чтобы он поднимал с диска страницы (и свопил их обратно)?
> сохранять состояние игры и переживать перезапуск
Охуенная будет ММО, если состояние не сохранять. Там ради этого второй процесс был, который в BDB изменения коммитил. На случай если основной наебнётся.
> гейдевки вполне могут и так
Да я сварщица не настоящая. Вангую, что в реале совсем другие архитектуры юзают. Здесь же даже масштабирование не было продумано.
События в WAL (Write Ahead Log) дампить, и при рестарте проигрывать. Снапшотить асинхронно и как угодно, хоть грязными чтениями. По теореме Снаута главное чтобы WAL начинался с момента раньше первого грязного чтения.
Сначала писать в WAL, потом его проигрывать в mmapнутую память? Это годно, но нужно выбрать атомарность, если там каждый питушиный шажок это отдельная транзаккция, то будет неуободно
Ну да, у меня каждый питушиный шажок отправлялся в соседний процесс на сохранение. А он каждую секунду коммитил пачками в BDB.
Не обязательно же WAL флашить на каждый чих, если какие-то потери допустимы (секунда если процесс с базой помрёт, в районе одного кадра если основной).
> Сначала писать в WAL, потом его проигрывать в mmapнутую память? Это годно, но нужно выбрать атомарность, если там каждый питушиный шажок это отдельная транзаккция, то будет неуободно
В няивной имплементации достаточно просто синхронизировать импорт операций из лога с чтениями, которые делает дампер снэпшотов, чтобы он мусор не прочитал. Транзакции не нужны по сути.
Обеспечивать высокий уровень нядёжности имеет смысл только для критических данных:
\begin{enumerate}
\item Различные балансы, как внутриигровых валют, так и донатных.
\item Внутриигровые/донатные сделки (аукцион, магазины), письма.
\item Характеристики персонажей (опыт, скиллы, достижения...).
\item Инвентари персонажей, "банки"/"хранилища" и прочее.
\item Характеристики предметов: кулдауны, прочности и так далее.
\end{enumerate}
Все эти данные желательня при падении процесса ня терять. Остальную же фигню, вроде положения ня карте, направления взгляда, скорости и прочего, можно хранить без особых церемоний: всё равно после аварийняго завершения процесса придётся всех персонажей телепортировать в безопасное место (стартовую локацию какую-нябудь).
Речь идёт об обеспечении нядёжности хранения ня случай падения процесса игры. После падения сервера спидраннерам будет нямножко няплевать, сохранилось ли их положение ня карте или нят.
"А теперь мы сдаём квест. Обычно после этого нас телепортируют из инстанса, и необходимо проходить квестовую линейку на 2-3 часа, чтобы попасть в него снова и завершить необходимый нам квест. Но если уронить сервер специально сформированным запросом до начала диалога в следующей локации, после перезапуска мы останемся в инсте и сможем немедленно закончить всю линейку. Так как перезапус занимает около 30 минут, мы можем сэкономить до двух часов."
Имення поэтому, как я няписала в предыдущем комментарии, в реальных ММОРПГ после падения сервера персонажи телепортируются в "безопасные локации" (всякие там города) со сбросом повторяемых квестов/инстансов.
Да обычная выживалка, где можно деревья рубить и всякую хуйню крафтить. В общем-то только это и запилили перед тем как забить, до боёвки дело не дошло.
Просто хотелось на чём-то потренироваться с boost::asio.
тз вообще было десктопной приложухой на крестах и на кутэ, потому что я тогда кутэ чуть-чуть знал. был выбор: или вот эта трахомундия, или олимпиадные задачки...
нашёл старую школьную тетрадку, в которой расписывал игру, похожую на морровинд. хочу теперь наконец-то сделать. программировать не умею, нужен помощник. время две недели, бюджет $400
> Все работы проводятся в строгом соответствии с нормами СанПиН только качественными сертифицированными средствами. Гарантированное качество услуг. Приедем в удобное для Вас время. Мы гарантируем высокое качество и низкие цены!
Это заказ или спам?
> Короче, ушла я от вас.
> Не вписываюсь в коллектив, что уж поделаешь. Все плюсуют улюлюкающих троллей и минусуют мои претензии по поводу культуры общения.
PolinaAksenova # 0
(╥﹏╥)
JloJle4Ka # 0 ⇈
JloJle4Ka # 0 ⇈
Это надо было одной функцией оформить?
booratihno # 0 ⇈
>-1
какой ИИ ))
Steve_Brown # 0 ⇈
guest # 0 ⇈
PolinaAksenova # 0 ⇈
JloJle4Ka # 0
https://gist.github.com/ForNeVeR/9001938
Щи!!!! Симулятор жестокости.
[email protected] # 0 ⇈
http://govnokod.ru/9903
booratihno # 0 ⇈
JloJle4Ka # 0
Главное отличие хабра от говнокода. Не в пользу хабра.
PolinaAksenova # 0 ⇈
booratihno # 0
какое имя метода ))
>> Matrix = new int* [8]
>> Matrix[i] = new int[8];
какая структура ))
> //Координаты пешек для отрисовки
>> ChessX = new double[18];
надеюсь, для каждой фигуры есть такой массив?
>>double
пешка может на пол шышечки на клеточку залезть?
>>if (i > 8)
я понял, это потому что 8x8?
>aicountthirdrow
а есть eighthrow?
JloJle4Ka # 0 ⇈
Это потому что в бильярде есть такой шар.
bormand # 0 ⇈
Эм, конструктор же. Что не так?
guest # 0
https://habr.com/ru/post/541462/
Рассмотрим 5 сортировок. Это пузырьковая(bubble), шейкерная(shake), пирамидальная(heap), вставками(insertion) и быстрая(quick).
Для анализа их скорости будет использоваться функция clock()
Каковы же результаты?
С большим отрывом идет sort из stl, потом вставками, пирамидальная, шейкерная и заканчивает пузырьковая.
-----
и как всегда в таких штуках меня поражает, что автору совсем не 16 лет, как вы бы могли подумать
JloJle4Ka # 0 ⇈
Кстати, в почему сорт из СТЛ такой быстрый?
booratihno # 0 ⇈
https://www.geeksforgeeks.org/analysis-of-different-sorting-techniques/
Если уж реально измерять скорость, то на реальных данных
>быстрый
не знаю, наверное его писали скильные питухи, знающие как работает процесарь
booratihno # 0 ⇈
https://habr.com/ru/post/461503/
можно еще про vectordrum пошутить, но я не буду
booratihno # 0 ⇈
npopa6 # 0 ⇈
JloJle4Ka # 0 ⇈
КАКОЙ ЛИНУКС !!! ))))))
[email protected] # 0 ⇈
Мартышка и очки Вендоадмин и линукс
booratihno # 0 ⇈
defecate-plusplus # 0 ⇈
booratihno # 0
https://habr.com/ru/post/520400/
автор показывает, что бывает, если накопипастить разные строчки с разных мест часть на си, часть на плюсах)
там еще много прекрасного, вроде такго
>Вкратце в вечном цикле создаются потоки для каждого клиента и ждут accept
сама задача такая: автор не знал, что в активном режиме FTP не работает за NATом, и "Не найдя ответа на куче форумов" решил написать свой сервер и клиент на винсок, а за одно и реализовать шифрование (про TLS автор не знает)
PolinaAksenova # 0 ⇈
Повеяло корпоративным духом джавамэня.
(ノ´ヮ`)ノ*: ・゚
booratihno # 0 ⇈
ну хотя да: автор думает, что векторы всегда нужно создавать через new.
вообще по какому приниципу он выбирает место для хранения не очень понятно. Кажется, что если код напоминает ему C++, то он делает new, а иначе автоматическую (или статическую) перерменную
JloJle4Ka # 0 ⇈
booratihno # 0 ⇈
Если без зеленого, то вектор же хранит свои данные в алокаторе (вероятнее всего в куче), а на стеке там только такая куржопенькая ручка из трёх указателей (или двух указателей и размера?) (потому вектор обычно sizeof 24, но не обязан)
JloJle4Ka # 0 ⇈
booratihno # 0 ⇈
алсо, если уж выделять его там, то хотябы не через сырой ню, а через умный указатель, чтобы он сам удалился (у автора он не)
Про юбмедед не понял. У тебя там скорее всего заранее известно сколько памяти нужно, и можно взять вообще массив
JloJle4Ka # 0 ⇈
Кстати, а как тебе языки с возможностью шаманить с аллокаторами? Типа «Odin».
PolinaAksenova # 0 ⇈
Типа "C++"?
JloJle4Ka # 0 ⇈
Как тебе "С++", Полина?
PolinaAksenova # 0 ⇈
defecate-plusplus # 0 ⇈
j123123 ненавидит С++, потому что не смог, вот и бесится
JloJle4Ka # 0 ⇈
Кстати, смотри какой аллокатор:
defecate-plusplus # 0 ⇈
PolinaAksenova # 0 ⇈
JloJle4Ka # 0 ⇈
Вроде бы, аллоцирует всякую фигню в ФАЙЛЕ, который находится в ОПЕРАТИВНОЙ ПАМЯТИ.
defecate-plusplus # 0 ⇈
JloJle4Ka # 0 ⇈
PolinaAksenova # 0 ⇈
booratihno # 0 ⇈
вот такая хернь есть
https://chromium.googlesource.com/chromium/chromium/+/refs/heads/main/base/stack_container.h
// This allocator can be used with STL containers to provide a stack buffer
// from which to allocate memory
Есть еще VLA, но вроде тока в няшной.
наконец, если ты статически знаешь размер, то есть std::array
----
Вообще если ты заранее знаешь размер (в ембеде вероятно это так) то может и вектор тебе не нужен
JloJle4Ka # 0 ⇈
PolinaAksenova # 0 ⇈
booratihno # 0 ⇈
j123123 # 0 ⇈
defecate-plusplus # 0 ⇈
Вектор даёт крутилку предусмотреть нужный тебе размер аллокации заблаговременно
https://en.cppreference.com/w/cpp/container/vector/reserve
j123123 # 0 ⇈
Скомпилируем и запустим под strace:
Почему я не вижу тут mremap() ?
booratihno # 0 ⇈
но тока он mremap не использует, а не "realloc"
realloc тоже не обязан ремапить, если
он может рядышком выделить память
realloc есть, а ремапа нет (у меня)
а если ``limit`` поменять на ``4096``, то появится
зы: во
https://news.ycombinator.com/item?id=23677695
j123123 # 0 ⇈
И посмотреть на strace
Почему в контейнерах так не осилили сделать?
defecate-plusplus # 0 ⇈
Комитет сказал нахуй надо. Слава демократии.
https://stackoverflow.com/a/6391202
PolinaAksenova # 0 ⇈
Вызов realloc(), в силу своей говённости, ня позволяет детерминированно контролировать, будет ли диапазон памяти просто расширен или скопирован в новую область. Это, в свою очередь, ня позволило добавить универсальную функцию realloc() в аллокаторы, и как следствие — распространённые реализации контейнеров ня используют realloc().
[email protected] # 0 ⇈
j123123 # 0 ⇈
А в чем проблема? Для этого достаточно сравнивать указатель до и после realloc.
Если вместо malloc() делать new() - копирования хуйни - delete(), мы разве лучше что-то контролируем?
PolinaAksenova # 0 ⇈
j123123 # 0 ⇈
Почему меня это должно волновать? Вот конкретно для кейса, когда я делаю push_back в вектор, какая мне разница, откопируется ли оно при realloc или останется на месте? Я уж не говорю о том, что никакого фактического копирования может и не происходить, учитывая что есть MMU
Каким образом вариант "всегда выделяем новую память и копируем хуйню из старой в новую, а старую освобождаем" оказывается лучше?
PolinaAksenova # 0 ⇈
Тебя-то понятное дело не должно, ты на крестах ня пишешь.
В общем случае копировать объекты через memcpy(), как делает это говноrealloc(), няльзя.
j123123 # 0 ⇈
Почему тогда для частных случаев нельзя использовать realloc() ?
PolinaAksenova # 0 ⇈
booratihno # 0 ⇈
почему нету ключика "prefer_realloc" и разрешать тока для тривиали копибл?
j123123 # 0 ⇈
PolinaAksenova # 0 ⇈
Собственно, если в твоём приложении реаллоцирование вектора с тривиальня-копируемыми объектами является бутылочным горлышком, то всегда можня взять другую либу, няпример, https://github.com/facebook/folly/blob/master/folly/docs/FBVector.md . Стандартные контейнеры — ня червонцы, всем и во всех случаях нрявиться не могут.
booratihno # 0 ⇈
at its current location, then mremap() fails
Почему нельзя было сделть так:
* Если можем расти на том же месте, то растем без копирования
* Если не можем, и тривили копибл, то запускаемся с MREMAP_MAYMOVE
А иначе делаем как сейчас
Или это было бы не кросс-платформенно?
j123123 # 0 ⇈
Надо разобраться с тем, как эта херня с лоу-левельным выделением памяти работает например в той же винде. Наверняка можно что-то скостылить.
PolinaAksenova # 0 ⇈
guest # 0 ⇈
От вас, Полина, не ожидал таких выражений
PolinaAksenova # 0 ⇈
CHayT # 0 ⇈
gologub # 0 ⇈
https://pravo.ru/store/images/4/11661.jpg
MAKAKA # 0 ⇈
MAKAKA # 0 ⇈
Реаллочить кококококтейнеры в общем случае нельзя, потому что в крестах (в отличие от няшки) бывают не тривиальные объекты, которые нельзя скокококококпировать просто так
Можно было изъябнуца и сделать ооооптимизации, но всем опхуй
PolinaAksenova # 0 ⇈
MAKAKA # 0 ⇈
Интересно было бы няписать статью со сравнением работы виртуальной памяти прыщей и винды, и вообще серию статей со сравнением подсистем (tty vs ConsoleAPI итд)
Я бы почитал
bormand # 0 ⇈
Да я думаю есть такие... Просто найти надо.
booratihno # 0 ⇈
bormand # 0 ⇈
Дык это ресёрчить надо перед тем как писать...
Desktop # 0 ⇈
MAKAKA # 0 ⇈
bormand # 0 ⇈
[email protected] # 0 ⇈
PolinaAksenova # 0 ⇈
А как иняче-то сделать неинтрузивные list, set/map, shared_ptr? Тебе в любом случае придётся выделять "struct Node {Node *next; T value; }" для списка, "struct Node {Node *left, *right; T value; }" для сета/мапы и так далее.
bormand # 0
Никогда не говори никогда...
DypHuu_niBEHb # 0 ⇈
bormand # 0 ⇈
У меня одно время было желание восемь звёзд ебануть. Пришлось его пересиливать и заворачивать в шоблон.
DypHuu_niBEHb # 0 ⇈
Если же речь о том, что целый ряд "Xleft" можно не создавать?
Тогда всё таки лучше завернуть это в объект и нормально чистить за собой
bormand # 0 ⇈
Ну да, я поэтому и пишу про разрежённую структуру... Яркий пример -- интеловские пейджтейблы.
> завернуть это в объект
Да, но внутри то у него эти new никуда не денутся. А вектор-из-указателей для этого юзать особого смысла нет.
DypHuu_niBEHb # 0 ⇈
Иными словами как пропустить ряды я понял, а как бы ты пропустил колонку?
>Да, но внутри то у него эти new никуда не денутся.
хотябы снаружи не выглядело бы как грязь
bormand # 0 ⇈
Х.з., от плотности зависит... Хешмапу какую-нибудь, если плотность никакая. Если поплотнее -- N'арное дерево (те самые восемь звёзд).
DypHuu_niBEHb # 0 ⇈
bormand # 0 ⇈
Мне лень вникать в эту портянку, сорри. Что за расстояния там хранятся?
DypHuu_niBEHb # 0 ⇈
В общем тут вполне себе известный заранее, не разреженный и не очень большой массив какого-то говна, который не понятно зачем так сделан
bormand # 0 ⇈
Нужно больше индирекций! На первом слое пусть будут условно блоки по 10000 строк и 10000 колонок. На втором -- внутри них блоки по 100. На третьем -- собственно сами значения.
2D дерево, короче.
DypHuu_niBEHb # 0 ⇈
сразу видно, что ты системщик ))
bormand # 0 ⇈
Я эту структуру хотела юзать чтобы карту для ММОРПГ хранить (зоны вокруг игроков префетчятся в память, остальные уходят спать на диск). Поэтому она действительно очень близка к пейджтейблам.
Обычный mmap тут не совсем подходил т.к. там куча вещей переменной длины и нужно было freeze/thaw обрабатывать явно.
DypHuu_niBEHb # 0 ⇈
Нельзя было никак сделать свое "хранилище" из блоков размером в страницу, и как-то всё это туда упаковывать (ну переменной длинны, но можно же как-то всунуть?), чтобы он поднимал с диска страницы (и свопил их обратно)?
bormand # 0 ⇈
DypHuu_niBEHb # 0 ⇈
тогда понятно
но всё равно выглядит как оверлеи прямо какие-то, хотя я верю, что гейдевки вполне могут и так
bormand # 0 ⇈
Охуенная будет ММО, если состояние не сохранять. Там ради этого второй процесс был, который в BDB изменения коммитил. На случай если основной наебнётся.
> гейдевки вполне могут и так
Да я сварщица не настоящая. Вангую, что в реале совсем другие архитектуры юзают. Здесь же даже масштабирование не было продумано.
DypHuu_niBEHb # 0 ⇈
bormand # 0 ⇈
Ну можно классику -- бекап + лог транзакций от бекапа. Работать будет.
CHayT # 0 ⇈
DypHuu_niBEHb # 0 ⇈
вероятно можно делать транзакции по времени
bormand # 0 ⇈
Ну да, у меня каждый питушиный шажок отправлялся в соседний процесс на сохранение. А он каждую секунду коммитил пачками в BDB.
Не обязательно же WAL флашить на каждый чих, если какие-то потери допустимы (секунда если процесс с базой помрёт, в районе одного кадра если основной).
CHayT # 0 ⇈
В няивной имплементации достаточно просто синхронизировать импорт операций из лога с чтениями, которые делает дампер снэпшотов, чтобы он мусор не прочитал. Транзакции не нужны по сути.
PolinaAksenova # 0 ⇈
\begin{enumerate}
\item Различные балансы, как внутриигровых валют, так и донатных.
\item Внутриигровые/донатные сделки (аукцион, магазины), письма.
\item Характеристики персонажей (опыт, скиллы, достижения...).
\item Инвентари персонажей, "банки"/"хранилища" и прочее.
\item Характеристики предметов: кулдауны, прочности и так далее.
\end{enumerate}
Все эти данные желательня при падении процесса ня терять. Остальную же фигню, вроде положения ня карте, направления взгляда, скорости и прочего, можно хранить без особых церемоний: всё равно после аварийняго завершения процесса придётся всех персонажей телепортировать в безопасное место (стартовую локацию какую-нябудь).
Desktop # 0 ⇈
- спидраннеры оценят
хотя какие конечно в мморпг спидраннеры
bormand # 0 ⇈
Блин, да в большинстве синглов чуть ли не всю карту резетят когда с чекпоинта перезагружаешься...
З.Ы. Скучно стало, раньше можно было засейвиться за секунду до смерти и пытаться выбраться из этой ситуации.
Desktop # 0 ⇈
потому можно например прыгнуть с 100000 метров вниз, перед самым приземлением квиксейв-квиклоад и вуаля!
Desktop # 0 ⇈
- FUUUU консольщина
DypHuu_niBEHb # 0 ⇈
На девятьсот девяносто шестой раз научишься первый уровень проходить
Desktop # 0 ⇈
PolinaAksenova # 0 ⇈
DypHuu_niBEHb # 0 ⇈
потому что детство...
bormand # 0 ⇈
Это олдскульная соснольщина. А в современной можно просто перекатиться за соседний ящик и смотреть кинцо в 30 FPS дальше.
DypHuu_niBEHb # 0 ⇈
впрочем, в моих любимых играх можно было сохраняться в некоторых местах (в домах, например)
Desktop # 0 ⇈
можно поставить самый высокий уровень сложности в современной соснольщине и получать два чекпоинта на уровень и ваншоты-хедшоты от любого ашота
Desktop # 0 ⇈
PolinaAksenova # 0 ⇈
[email protected] # 0 ⇈
PolinaAksenova # 0 ⇈
guest # 0 ⇈
bormand # 0 ⇈
Whitepaper поди пишет какой-нибудь?
guest # 0 ⇈
Desktop # 0 ⇈
Desktop # 0 ⇈
Desktop # 0 ⇈
bormand # 0 ⇈
До клиентов? Никак, лол. Очень грубая экстраполяция на движение перса (чтобы уж совсем рывками не бежал) и всё.
Desktop # 0 ⇈
bormand # 0 ⇈
Просто хотелось на чём-то потренироваться с boost::asio.
Desktop # 0
там ещё хотели искусственный интеллект и чтоб за два дня
когда джун и неадекватные собесеры выстраиваются в ряд, получается такое вот затмение
bormand # 0 ⇈
Но это не уголки, а странные шахматы! Это другое.
DypHuu_niBEHb # 0 ⇈
bormand # 0 ⇈
Что-то мне намекает, что потом так и пришлось бы писать уголки с ИИ за 2 дня каждую неделю. Мобильный гейдев такой мобильный.
Desktop # 0 ⇈
тз вообще было десктопной приложухой на крестах и на кутэ, потому что я тогда кутэ чуть-чуть знал. был выбор: или вот эта трахомундия, или олимпиадные задачки...
DypHuu_niBEHb # 0 ⇈
вот еще выдумывать какие-то мы хорьки очень любим уголки
Desktop # 0 ⇈
DypHuu_niBEHb # 0 ⇈
Вообще задача "найти подходящий алгоритм" звучит как хорошая задача для крепкого мидла
Только на самом собеседовании я бы обосрался со страху конечно, и ничего не сказал
А дома порылся бы, и наверное нашел как решить
---
Олимпитухи должны наверное такие задачи щелкать
А я умею решать задачи с "интеллектом" для игр путём перебора: строишь дерево всех возможных вариантов, и всех их обходишь.
Только это не быстро) зато надежно
Desktop # 0 ⇈
DypHuu_niBEHb # 0 ⇈
я уже нагуглил
https://smekni.com/a/115958/razrabotka-algoritma-i-realizatsiya-igry-reversi/
Desktop # 0 ⇈
плюс ии это же не вся игра ещё
и код успеть порефакторить от говна
и всё это под песню "сегодня вторник, а вот в четверг хотелось бы получить"
а сам проверяющий в итоге потом не смог даже запустить, хотя это был обычный кутэшный проект, сбацанный в обычном кутэкреаторе
bormand # 0 ⇈
Для таких умников можно предложить шахматы или го.
DypHuu_niBEHb # 0 ⇈
Desktop # 0 ⇈
DypHuu_niBEHb # 0 ⇈
Desktop # 0 ⇈
бля, почему до сих пор не постил сюда задания с фриланс-бирж?
DypHuu_niBEHb # 0 ⇈
Ищу программистов и админов для поддержки, пока на общественных началах (но выручку разделим)
guest # 0 ⇈
https://www.weblancer.net/projects/veb-programmirovanie-31/skript-dlya-tilydy-1114471/
десять баксов-то не лишние
Desktop # 0 ⇈
ха-ха-ха, какое SEO
PolinaAksenova # 0 ⇈
Это заказ или спам?
Desktop # 0 ⇈
но блин, это подход. если пхп никто не поправит, так хоть прорекламируемся
DypHuu_niBEHb # 0 ⇈
Desktop # 0 ⇈
make a high-end game for sales
Fixed-price: $300
DypHuu_niBEHb # 0 ⇈
Desktop # 0 ⇈
DypHuu_niBEHb # 0 ⇈
HEu3BECTHblu_nemyx # 0 ⇈
https://www.linux.org.ru/forum/talks/3686890
defecate-plusplus # 0 ⇈
j123123 # 0 ⇈
Sikon тут тоже был(а), это https://govnokod.ru/user/3764/codes
> Короче, ушла я от вас.
> Не вписываюсь в коллектив, что уж поделаешь. Все плюсуют улюлюкающих троллей и минусуют мои претензии по поводу культуры общения.
Какая драма )))
http://wikireality.ru/wiki/Sikon вот еще какая-то инфа
JloJle4Ka # 0 ⇈
j123123 # 0 ⇈
JloJle4Ka # 0 ⇈
Desktop # 0 ⇈
Desktop # 0 ⇈
bormand # 0 ⇈
Какая транзитивность )))
JloJle4Ka # 0 ⇈
defecate-plusplus # 0 ⇈
bormand # 0 ⇈
Про свойства отношений можно гуглить.
JloJle4Ka # 0 ⇈
bootcamp_dropout # 0 ⇈
JloJle4Ka # 0 ⇈
booratihno # 0 ⇈
забань меня полностью
Desktop # 0 ⇈
Тут хотел уже нахрюкнуть, но оказалось, что Rumble in the Jungle was a real thing