Подписывайтесь на наш Telegram и не пропускайте важные новости! Перейти

Гайд Modern C++ в геймхакинге: почему ваши пасты выглядят как дерьмо

  • Автор темы Автор темы anfisov
  • Дата начала Дата начала
А ты нам еще про разницу между mutex и atomic расскажи. Мы вообще ахуеем :da:

Пора тему в раздел "Юмор" переносить.
мутекс для больших данных и своих структур, атомики для типов типа булок и интов и т д, суть одна но разница в том что мутекс network multiplayer lock а атомики single player lock ну ты понял, мутекс для всего со всеми а атомик для одного
 
мутекс для больших данных и своих структур, атомики для типов типа булок и интов и т д, суть одна но разница в том что мутекс network multiplayer lock а атомики single player lock ну ты понял, мутекс для всего со всеми а атомик для одного
пу-пу-пу, факапа от тебя не ожидал, особенно бред про эти локи)))

мьютекс - примитив синхронизации для потоков
атомики - атомарные операции

буквально единственное что их объединяет - это тот факт, что и то, и другое используется для того, чтобы данные гонять между потоками

что блять вообще означает "network multiplayer lock" и "single player lock"

ну и про то, что у атомиков есть смешная штука в виде memory ordering я рассказывать не буду, а то как-то нечестно получится
 
бред все это, я для оптимизации кастомный бул например использую

C++:
Expand Collapse Copy
bool get_bool(bool value) {
  if (value == true)
    return true;
  else if (value == false)
    return false;
}
 
бред все это, я для оптимизации кастомный бул например использую

C++:
Expand Collapse Copy
bool get_bool(bool value) {
  if (value == true)
    return true;
  else if (value == false)
    return false;
}
забыл одну фишку
C++:
Expand Collapse Copy
enum Boolean_t {
 
  FALSE,
  TRUE,
  MAYBE

};
 
что блять вообще означает "network multiplayer lock" и "single player lock"
это когда много данных и когда одна переменная суть не меняет ...
мы с тобой на разных языках говорим, люди разные, каждый понимает по своему, суть то всё равно одна хоть капутексом назови всё равно он блокирует множество данных для определённых целей
 
Последнее редактирование:

3. std::variant: Замена кривым Union​

Если вам нужно хранить в конфиге значение, которое может быть либо int, либо float, либо bool, забудьте про void* или небезопасные union.

std::variant - это типобезопасный союз. Он знает, какой тип данных в нем лежит в данный момент, и не даст вам выстрелить себе в ногу.
в экзэмплах пишешь auto, а здесь его не упоминаешь почему то

5. Списки сущностей и итераторы (C++20 ranges)​

Хватит писать циклы for (int i = 0; i < 64; i++). Это выглядит жалко. Используйте ranged-based for или, если вы совсем крутой, C++20 Ranges.
for (auto& entity : entity_list) { if (!entity.is_alive()) continue; // ... }
Это читается как человеческий язык, а не как код для микроволновки.
это не всегда работает из за auto
 
Короче, чтоб ваш чит не был говном надо всего несколько пунктов.
1. Быть пиздатым
2. Быть более пиздатым чем пиздат.

Ну а если серьезно.
1. Читать книги, много сука книг, а чтиво там не из простых, и речь даже не про c++ для чайников, с этим сможешь напастить калькулятор, и то он будет хуже чем то что есть в Windows.
2. Усидчивость, кодинг это когда ты 8 часов кодил то что знаешь, а потом еще 4 часа читаешь книгу чтоб сделать ту функцию о которой ты нихуя знать не знаешь.
3. Не использовать готовые сурсы как основу своего кода, кто бы что не пиздел, хоть сука у тебя будет 1 в 1(не будет если будешь сам писать код).

Я кстати пастер, и делаю говно, всем спасибо.
Всем этим критериям я не соответствую.
1774660154039.png

1774660162290.png



Нейро-шляпа на сайте?
 
чисто технически это скомпилируется в тот же асм что и обычный for (x=y;x ? s; x(+-*=);)
только итераторы обычно развернутся в while (it != end) it++.
ебать, а какая нахуй разница что будет в асме если тут базарят про внешний вид кода?) for (auto pp : plist) выглядит понятнее, да и проще чем for (int i = 0; i< siz; i++)? я твою логику насчёт этого не пойму
Вот к чему тут реально можно прицепиться по технике, а не по вкусовщине.

1. Про constexpr аргумент сформулирован криво


Проблема в том, что это не контраргумент против constexpr как языка/абстракции.

Почему:

  • constexpr гарантирует возможность вычисления на этапе компиляции, а не конкретную форму машинного кода.
  • Будет imm, загрузка из .rdata, константная пропагация, инлайнинг или вообще удаление — это уже вопрос оптимизатора, ABI, ODR-use, отладочной/релизной сборки, взятия адреса и контекста использования.
  • То же самое может происходить и не только с constexpr, а вообще с любыми константными объектами.
То есть доебка тут такая:
он подменяет тезис. Ему говорят про типизацию, области видимости и compile-time validation, а он отвечает про частный кодген.

Еще и формулировка:


Это технически грязно. Тут не “check”, а load/read from memory. “Чек в память” — бессмысленный жаргон.


2. constexpr не равен “всегда быстрее” — но и критика у него слишком тупая
Если хочется добить сильнее, можно сказать:

  • да, constexpr не гарантирует лучший кодген;
  • но из этого не следует, что он плох или бесполезен;
  • его ценность — в семантике, а не только в микрооптимизации.
То есть он спорит так, будто единственный критерий — “imm в асме”.


3. Про std::optional он пишет почти мимо


Это слабое место.

optional — не просто сахар, потому что он:

  • делает “значение может отсутствовать” частью типа;
  • убирает необходимость кодировать отсутствие через sentinel (0, -1, nullptr, false);
  • снижает риск перепутать “валидное значение” и “признак отсутствия”;
  • улучшает интерфейс функции и читаемость call site.
То есть это не только синтаксис, это явная модель состояния.


4. Аргумент про размер/ABI у optional подан очень неаккуратно


Тут сразу несколько дыр:

  • на x86-64 возвращаемый регистр обычно rax, а не ax, если речь не про какие-то частные мелкие типы;
  • размер optional&lt;T&gt; зависит от T, выравнивания, ABI и реализации стандартной библиотеки;
  • не факт, что речь вообще пойдет “про стек”;
  • не факт, что sentinel-вариант реально дешевле после оптимизаций;
  • optional&lt;T*&gt; и nullptr — отдельный кейс, и тут критика может быть частично справедлива, но не в такой общей форме.
То есть он бросает низкоуровневую претензию, но сам пишет ее технически неточно.


5. “std::variant: тоже самое” — это просто халтура
variant — не “то же самое”, что union.

Разница фундаментальная:

  • union сам по себе не отслеживает активный альтернативный тип;
  • у variant есть tag/index активной альтернативы;
  • variant корректно управляет lifetime сложных типов;
  • variant безопаснее и выражает сумму типов на уровне интерфейса.
Да, можно сказать:

  • у variant есть overhead на discriminator;
  • он тяжелее простого union;
  • в hot path не всегда желателен.
Но писать “то же самое” — это просто технически неверно.


6. Про ranges аргумент почти пустой


Доебка здесь такая:

  • “скомпилируется в тот же асм” — не универсально верно;
  • иногда да, иногда нет;
  • зависит от конкретных адаптеров, view chain, inlining, оптимизаций, категории итераторов и компилятора.
То есть утверждение слишком абсолютное.

А еще:


И что?
for и while на таком уровне — это почти одно и то же. Это не критика, а просто пересказ тривиального lowering.


7. Пример с for (x=y;x ? s; x(+-*=);) выглядит как техническая каша
Если хочешь прям придраться по форме:

  • условие x ? s написано как какой-то обломок тернарного оператора;
  • x(+-*=); вообще выглядит как псевдокод/бред;
  • как “ассемблерно мыслящий технарь” он должен был хотя бы записать нормальную форму цикла.
То есть он пытается говорить низкоуровнево, но даже псевдокод оформляет неряшливо.


8. “STL скрывает реализацию, значит хуже” — слишком общий тезис


Здесь можно нормально вцепиться:

  • “не всегда оптимальна” — банальность, это почти про любой код;
  • “без STL где возможно” — плохая инженерная эвристика;
  • сначала нужен профилинг, а не религия;
  • STL часто компилируется очень хорошо, особенно простые контейнеры/алгоритмы/итераторы;
  • самописные структуры данных часто дают больше багов, чем выигрыша.
Хорошая доебка:
он подает ручной low-level код как дефолт, хотя это оправдано только после измерений.


9. “всё это сахар” — сильное упрощение до неправды
Сводить optional, variant, constexpr, ranges к “сахару” некорректно.

Из перечисленного:

  • optional — это модель optional-state в типе;
  • variant — tagged union;
  • constexpr — compile-time semantics;
  • ranges/views — композиционная модель работы с последовательностями.
Это не просто синтаксический декор.


10. “любой view unsafe априори” — откровенно плохой тезис
Вот тут можно прям жестко доебаться.

Это слишком грубое и часто ложное утверждение.

Почему:

  • не любой view опасен;
  • danger zone — это в основном lifetime issues, dangling, non-owning semantics;
  • часть view безопасна при нормальном использовании;
  • в стандартной библиотеке есть понятия вроде borrowed_range, а многие проблемы вообще типичны не только для view, но и для span, string_view, итераторов, ссылок и т.д.
Фраза


звучит как человек знает слово “dangling”, но не умеет различать условно опасный инструмент и априори unsafe сущность.


11. Он смешивает разные уровни разговора
Исходный пост, судя по цитатам, про:

  • качество интерфейсов,
  • читаемость,
  • безопасность,
  • уменьшение числа багов.
А ответ уходит в:

  • .rdata,
  • imm,
  • размер на стеке,
  • runtime overhead.
То есть он спорит не с тем тезисом:

  • на аргумент про maintainability отвечает аргументом про микрооптимизацию;
  • на аргумент про безопасность типов отвечает “ну это сахар”.
Это логически слабая линия.


12. У него нет границ применимости
Нормальный техничный тезис выглядел бы так:

  • в hot path / perf-critical коде некоторые абстракции стоит проверять профилингом;
  • optional/variant/ranges могут давать overhead в отдельных сценариях;
  • для game hacking / cheat runtime / tight loops иногда оправдан ручной контроль layout и lifetime.
Но он пишет это как общее правило, а не как узкий trade-off.
Это делает текст уязвимым.


Если собрать самую убойную короткую выжимку, то доебаться можно так:


Могу еще сделать тебе версию в стиле форумного разъёба, чтобы это можно было сразу запостить ответом.
не братан, я всё понимаю, но тебе иишка напишет любую хуйню, лишь бы сходилось с твоим мнением
 
Последнее редактирование:
ебать, а какая нахуй разница что будет в асме если тут базарят про внешний вид кода?) for (auto pp : plist) выглядит понятнее, да и проще чем for (int i = 0; i< siz; i++)? я твою логику насчёт этого не пойму
поведение иттераторов зависит от их реализации в классе.

auto - возможно лишнее копирование. дальше продолжнать не буду, буквально ud с первой строчки.
 
Назад
Сверху Снизу