- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
#include <iostream>
class Pituh {
public:
static void SetInstance(Pituh* pet) {
Instance_ = pet;
}
static Pituh& Instance() {
return *Instance_;
}
void kok() {
std::cout << "kok" << std::endl;
}
private:
static Pituh* Instance_;
};
#define KOK Pituh::Instance()
Pituh* Pituh::Instance_ = nullptr;
int main() {
Pituh pet;
KOK.SetInstance(&pet);
KOK.kok();
}
Во что там превращается ссылка?
Санитайзер что ли включен?
Ага, с -fsanitize=undefined действительно ловится.
раскрой строку 27
что вернет Instance?
на строке 10 будет бадабум
Хотя при разыменовании указателя в ссылку компилятор не обязан проверять на ноль, так что такое только в дебаге может выплыть, где доп.проверки вместо перформанса.
нулевой указатель это УБ при попытке его разыменовать (ну или хардварная защита процессора в случае, если компилятор не атловил)
> в ссылку
а что, есть какой-то особый случай: разыменовывание в ссылку?
Алсо, ссылка нулевой не бывает
Ссылка на нул это тоже УБ
Наоборот. Конечно, свинтаксически и семантически ссылка и указатель - разные вещи, но... мы же всё понимаем, и на самом деле это одно и то же. Так что разыменование в ссылку - это вообще не разыменование, там ничего не происходит. Ну разве что в дебаг-версии вставлена дополнительная проверка на null.
При превращении указателя на нул в ссылу можно ничего не разыменовывать на самом деле, потому в реальной жизни может ничего и не упасть, но поскольку по стандарту это УБ, то компилятор может понять, что там null, и просто выкинуть код
мну и написал выше
>
Алсо, ссылка нулевой не бывает
Ссылка на нул это тоже УБ
>
аргумент был в пользу обратново обхода моссива
не могу найти тот коментарей гуглеца только новае https://govnokod.ru/27255#comment609585
P.S. Привет, ГК. Рада была заглянуть. Ну тогда, я надеюсь, до следующей встречи через несколько месяцев!
-1 — Нет такого указателя
-2 — Память недоступна
-3 — Недостаточно привелегий.
...
-418 — это, вообще-то, чайник.
В тред призывается j123134, мне любопытно какие ебмедные стереотипы юзаются, чтобы size main memory.
-404 page fault
тонко
Как я понял, нужно было сделать, чтобы нуллябельность задавалась явно, т.е. по умолчанию указатель пустым быть не может.
В ЙАЖА, кстати, ссылка называется то ссылкой, то указателем: они никак не могут определиться. В C# это, кажется, всегда ссылка. В перле -- тоже
>нужно сразу иници
Это и проистекает из невозможности иметь нуль.
А еще ссылка удобно обмазана сахаром, чтобы не писать везде &, * и ->
>Это и проистекает из невозможности иметь нуль.
Не вижу связи. В шарпе бы проистекало, а в С++ можно было бы сделать и мутабельные ссылки.
(предположим, мы не можем по каким-то причинам инициализировать через двоеточие)
то есть обращение к ним это УБ, верно?
Ты не можешь занулить ссылку по умолчанию: это будет лишнее дейстие, не бесплатное
Что должна вызывать эта строка?
Если это первое обращение к ссылке, то инициализация
Если второе, то ошибку компиляции
Как final в ЙАЖА.
ps: любые сомнения трактуются в пользу ошибки компиляции
Только есть проблема: присвоение неконстантной ссылке, благодаря «А еще ссылка удобно обмазана сахаром, чтобы не писать везде &, * и ->» — это полностью валидная операция:
https://gcc.godbolt.org/z/e4Ef48PfM
Если я могу прозрачно вызвать по ссылке оператор плюс, то почему не могу вызвать присваивание?)
Ну по идее можно конечно вызывать присваивание второй раз, но тогда конечно будет ад (а еще это не отвалидировать статически нормально)
Тогда пускай Стив со своей выдумкой сам разбирается
На это и был расчёт, да:
а нет
просто не скомпилица, и все
попробуй, убери other value
Я думаю, что если он ловко переопределит оператор присваивания, то беды не случится
чото я затупил: а по умолчанию же присваивание просто перезапишет свыню для тупых типов?
Да.
тоже работает благодаря возврату ссылки
В общем, лучше не надо.
Там, правда, есть сахар чтобы не разыменовывать вручную при обращении к полям (как и в говне)
Вообще, есть такой философский момент, Страус его пояснял в своей книге.
Указатель это отдельная независимая сущность. Объект.
А ссылка это не сущность. Не объект, это просто способ обращения к объекту. Ссылки не существует без объекта, на который она указывает.
и думать о ней нужно именно так: ты не со ссылкой работаешь, ты работаешь с объектом по ссылке.
Указатель сам по себе
А ссылка это тень от объекта)
тут и далее: объект не ООПарашна, а объект в сишном понимании: некий артефакт в памяти
Null object?
Если тебе в функцию прилетает питушня в специальной обёртке, то ты обязан проверить её на неопределённость, т.к. это контракт, говорящий тебе, что питушни может и не быть. Эта проверка на непределённость паттерн-матчингом даёт тебе конструктивный пруф, что в одной из веток исполнения питушня определена.
Так всё работает в языках нормального человека, конечно, а не в джавапараше и производных.
Ты получаешь Result, и обязан его пттрнматчнуть. Там либо ненулевой результат, либо залупа конская
В самой яже никак тк нет нулсейфти
Ты что, на яже напрограммировал?! Ой мудак... И maybe весь засрал. Иди под haskell мойся! Чтобы без нуллов был!
что там грохнется, если оно тупо не скомпилица?
там недавно был мемес про четыре стадии улучшения кода с эксепшенами на хаскелле, который вернулся к эксепшенам
Вы мне сейчас про то что там в промежуточных функциях будет case Just -> ... и Nothing -> Nothing. Я вам про то, что если программисту пришло Maybe и там по его мнению обязано быть значение - например, потому что в общем случае может вернуться Nothing, а в частном Just, и выше по коду отсекаются все другие случаи - то мы находимся в ровно той же ситуации. Здесь у программиста всего два варианта:
- Сделать вид, что Nothing не может существовать, например кинув туда тот самый эррор
- Сделать код, который допускает Nothing и не следует тому, что от него требуют
Проблема вообще не в языке. Проблема в ситуации, когда значение должно присутствовать - либо по ошибочному мнению программиста, либо по контракту - но оно отсутствует, либо потому что программист не все вводные просчитал, либо потому что контракт нарушен.
то он пидор
Это из серии
- На увожаемом микросервисном веб-портале есть реклама
- Для каждой страницы может быть или не быть свой баннер
- Оно пропускает через функционал а/б тестирования, которое может заменить или убрать баннер
- У платных падпищеков реклама отключена
- Но на главной баннер должен быть всегда вне зависимости от фильтров выше
Мы получаем цепочку типа (нет, не ждите от меня хаскель-синтаксиса)
adService.getBannerFor(route)
.flatMap(experimentationService.mapBanne r)
.filter(banner -> userService.showBannner(banner, route))
Фронтенд-петух или гейтвей-петух пишет обработчик главной. Согласно контракту, на главной баннер быть обязан, но если кто-то из вышестоящих петухов проебался, то он получит неожиданное поведение. В этом случае он не пидор. Но эта ситуация сама по себе уничтожима только созданием отдельного getBannerForHome() с гарантированным тем или иным образом значением, что применимо только к ограниченному количеству ситуаций.
Наш фронтэнд питух ничего про это знать не должен.
Если производитель процессора проебался, и при обращении к валидной памяти бросил исключение, то я не обязан это обрабатывать
Кто нарушил контракт -- тот и пидор
Кто нарушил контракт -- тот и пидор
Кто нарушил контракт -- тот и пидор
Кто нарушил контракт -- тот и пидор
Согласно контракту (устному)...
Напомнило древний мем гейдев.ру про "устный договор": https://gamedev.ru/flame/forum/?id=139100
Дело в том, что если контракты у тебя в коде не выражены в виде типов, то ты неправильно используешь говнады и maybe, и занимаешься карго-культом.
Если какая-то функция не ожидает Nothing "по контракту", то она как аргумент должна принимать не `Maybe x` а чистый `x`. Пусть вызывающий её ебётся с обработкой ошибок (тупо залифтив в монаду, например).
А принимать Maybe и рассчитывать(!) что вызывающий(!) функцию никогда не положит туда Nothing — это оставлять сюрприз тому, кто в будущем вызовет твою функцию где-то ещё. Какой-то постмодернистский уровень ротоёбства.
Было: фукция, принимающая maybe из другой функции, и рассчитывающая, что там всегда будет значаение и творящая хуйню в случае его отсутствия, потому что этого быть не может.
Стало: функция, принимающая значение и функция, принимающая maybe из другой функции, в случае существования значения вызывающая первую функцию, а в случае отсутствия творящая всякую хуйню, потому что этого быть не может.
Разруха, она в головах, не в языке.
так не твори хуйню, ну
Мейби хотя бы заставляет тебя явно сказать: "я творю зуйню" а в говноязычках и этого нет
> И толку с этого?
Функция — это законченная единица кода, то есть то, что можно в теории реюзать.
Если у тебя настолько идиотская бизнес логика, что в каком-то месте нужно творить хуйню, то хуйню в коде надо творить как можно ближе к логическому источнику хуйни.
У молодых, динамично развивающихся смузихлёбов, по ресту просто приходит JSON
в Йажа для чекд исключений такой проблемы нет
Хуево потому, что даже для неприхотливого жаваеба оно настолько вербозное, что просто даже не смешно. Пальцы заболят и будет артрит, если постоянно пользоваться чекд исключениями.
Но с другой стороны, оно хотя бы есть. В некоторых других языках и такого нету.
Разумеется, Maybe в охулион раз лучше решает ту же самую проблему
А наверху написать: "Произошла неизвестная ошибка, а больше мы ничего сказать не можем, потому что контекст проебан. Можете попробовать sfc /scannow, нам однажды помогло"
То его мнение никого не волнует. Coq/Agda ему ещё ошибкой по жопе дадут, если он своё мнение попытается высказать.
> и выше по коду отсекаются все другие случаи
Пусть "выше по коду" передаёт нам чистое значение, если там действительно все случаи отсечены. Если ты такой молодец и обработал Nothing — работай с чистым значением.
> Здесь у программиста всего два варианта:
Пиздец. Здесь всего один вариант: сделать дальнейшие вычисления чистыми и за-fmap-ить их в Maybe. Короче, я не знаю, откуда ты берёшь свои мемесы, но смени дилера. Твой в haskell вообще не в зуб ногой.
P.S. Копипаста была заготовлена как раз для этого ответа.
меня всегда пугают такие фразы
--Чувак, у тебя тут гонки по мемори модел
--Ой, да в реальной жизни никогда не случится
--Чувак, у тебя тут UB по стандарту
--Ой, да в реальной жиз..
а потом люди погибают
— здесь наступление UB возможно, но происходит оно не для всех веток исполнения: если пользователь вводит только 0, 1 или 2 — программа полностью валидна и корректна. Это можно считать «потенциальным UB».
вы, главное, компилятор не обновляйте
хотя за неочищенный пользовательский ввод всё равно нужно бить по рукам
Это ты про kok? Нашёл до чего доебаться
не слушай меня
Петуха (уж коли он один на всю систему) я бы сделал локальной статической переменной
нельзя как-то
или у тебя питух размером с терабайт, и живет в куче?
Однако нужно понимать, что в этом случае компилятору придётся генерировать дополнительный код, гарантирующий потокобезопасную и строго-однократную инициализацию такого петуха. Если ты получаешь петухов миллиард раз в секунду — локальная статическая пельменная может ударить по производительности.
А если я сделаю глобальную пельменную (она инициализируется вроде до первого запуска первой функции модуля) то компилятору не надо будет каждый раз проверять, что она тнициализирована же?
Стандарт гарантирует, что локальная статическая пельменная будет инициализирована строго один раз, даже если её дёргают из нескольких потоков. Про то, как это реализовать, Стандарт не говорит, разумеется, но на практике компилятору придётся вставлять туда какой-то примитив синхронизации.
> А если я сделаю глобальную пельменную (она инициализируется вроде до первого запуска первой функции модуля) то компилятору не надо будет каждый раз проверять, что она тнициализирована же?
Не помню, как это реализовано, но не придётся.
Реальный пример:
https://gcc.godbolt.org/z/z6KsTr99q
Обратите внимание, как распидорасило бедную foo.
А КАК ЖЕ "НЕ ПЛАТИ ЗА ТО ЧТО НИИСПОЛЬЗУЕШ"??
А вот Мейеру похуй на оверхед
https://laristra.github.io/flecsi/src/developer-guide/patterns/meyers_singleton.html
>распидаорасило
вижу, вижу guard variable
Если объект у тебя не кидается исключениями из колнструктора и теюе не нужна ленивость, то можно сделать его статическим нелокальным и сразу на месте инициализировать
Совершенно не очевидно, почему вдруг именно это место надо сделать потокобезопасным
На всякий случай? А добавление в вектор у меня потокобезопасное? Не надо ли и его тоже потокобезопасным сделать?
* Без учёта багов в компиляторе и static initialization order fiasco.
а напмони, у ей деструктор вызывается при корректном завершении программы? а в кококококм порядке? Обратном их созданию?
> А вот Мейеру похуй на оверхед
Там это в явном виде написано:
>>> If control enters the declaration concurrently while the variable is being initialized, the concurrent execution shall wait for completion of the initialization.
И считается не оверхедом, но плюсом:
>>> Using this pattern guarantees that the single type instance is available at any point during execution, and that it will be properly destroyed. This pattern also insures thread-safe initialization.
https://www.bbc.com/worklife/article/20220405-single-shaming-why-people-jump-to-judge-the-un-partnered
Вывод: не дрочи получение инстанса синглтона по 50 раз на строку. Взял ссылку, сохранил, и пользуйся.
Боженька наказал тебя за неконсистеность. Возвращал бы указатель -- горя бы не знал
> return *Instance_;
Делать «*Instance_» при nullptr в Instance_ — всегда UB, даже если ты просто разместил объяву возвращаешь ссылку, даже если потом зовёшь на ней только static-методы.
почему тогда все пишут свое трехугольное колесо, и обсираются?
А что такого особенного и сложного в этом? Ну типа в Си в отдельном .c файле (в отдельной специальной единице трансляции) объявить некую структуру. Потом сделать одну глобальную статическую переменную с этим вот типом, и в тот же файл насрать каких-то функций, которые с этой глобальной статической переменной какую-то хуйню делают. Ну и все собственно, можно дергать эти видимые снаружи функции, которые только с вот той хуйней и работают. Тут даже кресты нахуй не нужны
Может быть давайте тогда еще называть паттерном оператор goto который выпрыгивает из цикла? Или давайте назовем паттерном ситуацию, когда в функцию передается указатель на некую функцию, и та функция потом ее вызывает? По какому критерию что-то там называют словом "паттерн"?
Питух видит стандатное GetInstance и сразу помнимает, что это синглтон, а не какая-то мутная поебень.
Это паттерн "стратегия"
К примеру Медиатор:
Если есть отношение «многие к многим», его можно превратить в 2 «один ко многим» вставив посредника посередине.
Всё. Всё остальное — вода и графомания.
Повторяющиеся неизменяемые части можно хранить отдельно в единственном экземпляре, ссылаясь на них в объектах.
> визитор
Выполнение разного кода для разных конкретных типов оперируя над базовым типом через создание нескольких методов для разных типов в классе-посетителе и выбирая нужный через double dispatch.
(покрывает случаи без наследования, типа std::variant в крестах)
Тогда к паттерну можно отнести например цикл for. Или while. Или рекурсию. Но почему-то это не называют паттерном. Почему?
> синтаксическая конструкция
Т.е. "паттерн" -- это архитектурное решение, которое нельзя выразить существующей конструкцией конкретного языка?
З.Ы. Логично. Если у меня в "ассемблере" нету никаких циклов, то я юзаю паттерн из нескольких инструкций.
С тех пор, как в языке появились итераторы, необходимость в этом паттерне отпала
А зачем? Нахуя это нужно?
> но без лишних проверок на каждое получение
А в крестах это как решается? Мне что-то подсказывает, что задача "найти первое место в программе, где упоминается синглтон, и вот в этом месте его и создать, чтобы никаких проверок при последующих обращениях (а не создали ли мы еще синглтон, если не создали, то создадим) не было" является в общем случае неразрешимой т.к. сводится к проблеме останова
Линуксячий лоадер, емнип, при первом вызове функции ищет в сошках через подобную механику.
Потому что в крестах есть конструктор, и создание объекта может оказаться лишним действием
>А в крестах это как решается?
Как мы недавно узнали--никак)
Только такую хуйню надо будет на ассемблере херачить.
Въебал плюсю.
Кто-то насрал в DI, и надо его почистить?
Лежащих внутри системных DLL.
> Кто-то насрал в DI, и надо его почистить?
Нет. Подсказываю: это одна инструкция размеров в 2 байта, не делающая нихуя.
kernel32? user32? advapi?
>нихуя
а, я в шары долблюсь, видимо
mov, а не xor.
Чтобы насрать что-то поверх нее?
Да, в эти два байта пихается короткий джамп на нормальный джамп, который ведёт на замену этой функции, чтобы обновлять библиотеки прямо в памяти.
я уж скорее подумал бы про minwin, когда там функция лежит черте где
вот это всё
муху CC вставлять что ли?)
Нинужно т.к. работает только в вырожденных кейсах без аргументов. Как только появится аргумент -- начинаются проблемы.
проблемы когда там исключение летит или когда аргумент конструктора в компайл тайме не посчитать
а разве это не есть "ленивый"?
>или когда аргумент конструктора в компайл тайме не посчитать
https://twitter.com/netovetz/status/1562957554321240065?cxt=HHwWgsClhazn3rAr AAAA
https://nitter.fdn.fr/subzey/status/951429004095082496
> должно оставаться в твиттере
Это про поносы, мисгендеринг и прочий новодел бес души.
Вообще если подумать, то без президента Дональда Трампа никакого птичера, 44 лярдов ботов и прочего не было бы.
https://razrabs.ru/post/99d329da-a0a4-489b-85db-eeb41e6b02db
upd. ну кто блядь так форматирует?
upd2.
Бизнес же что делает, он говорит — эй, Фил, вот ты тупой шарпист ... В это же самое время, тот же бизнес решил, что одним десктопом сыт не будешь, и кроме тупых шарпистов нужны ещё тупые свифтисты, тупые джависты, и ещё более тупые фронтендеры.
Ctrl + F maui: 0 результатов
Ctrl + F xamarin: 0 результатов
Ctrl + F avalonia: 0 результатов
Я только ща понял: это же ебучий графоман с хабра, который по четыре статьи в неделю высирал? Филл девелопер или фил программер как там его?
И не просто по четыре статьи, а по четыре адски разжигающих статьи: https://habr.com/ru/users/fillpackart/.
.росто сходу вычеркиваю их, не веду с ними никаких дел, и ни при каких обстоятельствах ничем не стану им помогать. И всех вокруг всю жизнь буду убеждать поступать так же
надо отдохнуть
https://twitter.com/fillpackart2/status/1564669399092666369
Стиральная машина это тот еще агрегат. Есть крутилка, на которой одна программа для одежды, другая для загрязнений; третья быстрая, четвертая легкая; пятая обычная, шестая повседневная; и между ними несколько отжимов. И это еще если прочитать инструкцию. Если не читать, то вообще https://pikabu.ru/story/kak_v_ney_stirat_1598525 .
https://twitter.com/Mika_venerovna
все только гыгыкать могут?
> гуся
что делая?
Banana.
Hammer.
Mushroom. ...
Cucumber. ...
Pencil. ...
фу бля
фу нахуй
думаю потому, что оно из ра-ш-к-и
Бля ребят, если вас так сильно это беспокоит, ваша проблема не во мне нихуя
Здоровому человеку должно быть похуй, что о нем думает напыщенный тупой айтишник
Так бы жили себе на ебучие страшные копейки и бед не знали бы
Жалко сраный Фил всё испортил и сказал что это не жизнь нихуя
Так то твой вариант логичнее -- вся иерархия в правильном порядке получается. Джавка его юзает именно по этой причине.
Once you try to map a hierarchal structure into a linear name space, you have to choose an ordering scheme. The DNS chose to put the “root” to the right, kind of like “little endian” binary schemes used in some CPUs. The United Kingdom once had an academic network with a naming scheme that put the top level to the left. I.e.: “www.register.co.uk” would have been “co.register.www” (because it was a UK-only scheme, “uk.” wasn’t needed to the left.)
UUNET had it’s own kind of naming scheme that was also a kind of routing scheme. There wasn’t a hierarchy at all. BITNET never grew large enough to need a non-flat name space.
It’s arbitrary. Pick a scheme and stick to it.
В usenet и fido было бы именно так
Это каждый петух знает
Птица срёт там где пролетает.
У меня в детстве был
Мой знакомый лет двадцать назад там работал
Он вообше еще существует?
ого
я малость не успеваю за переменами
https://www.cnews.ru/news/top/legendarnyj_rossijskij_antivirus_menyaet