- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
AnsiString str = IntToHex((__int64) longvalue, 2); // 0x01020304
char _c[11];
char *ch = str.c_str();
int len = strlen(ch);
int _s = len;
int j = 0;
_c[j++] = '0';
_c[j++] = 'x';
while (_s >= 2) {
_c[j++] = ch[_s-2];
_c[j++] = ch[_s-1];
_s-=2;
}
if (len == 7) {
_c[j++] = '0';
_c[j] = ch[0];
}
_c[10] = '\0';
unsigned long pp;
char *pEnd;
pp = strtoul (_c, &pEnd, 16); // 0x04030201 - PROFIT!
ниработаит.
Хотя конечно строчек чуть больше.
А как же без сишной хуйни образца 1991-го года?
int len = strlen(ch);
?
Кстати, есть такой синдром, когда петух с СИ перелез на С++, но С++ не знает, и пишет вот такую вот хйню ручную перемежая ее классами
Зря.
через обычный массив чтобы идеологически красиво
Правильно такие вещи делать или сдвигами, или через std::memcpy() в массив и обратно, или каким-нибудь std::bit_cast. Все три способа современные компиляторы всё равно соптимизируют в один bswap.
J.1 Unspecified behavior
— The value of padding bytes when storing values in structures or unions (6.2.6.1).
— The values of bytes that correspond to union members other than the one last stored into
(6.2.6.1).
По-моему современные компиляторы вообще любое говно оптимизируют в bswap. Я вставил штук 10 разных реализаций (в т.ч. из этого треда) и они все стали bswap.
Кстати глянь что MSVC чудит. Это вообще ужасное тупое животное, которое ни одну идиому не восприняло.
>1. такие вещи делать или сдвигами
Сдвиги — это пирдоль, а не ЯВУ-way.
>2. или через std::memcpy() в массив и обратно
Пиздец Говно.
>3. каким-нибудь std::bit_cast
Вот именно поэтому я и люблю Кресты.
Был в Сишке очень простой и понятный способ даже джва: юнион и каст.
Пришли крестухи, усложнили всё до невозможности и начали умничать: «ой ты что, юнион же нельзя! И касты со скобочками нельзя!!»
«Нужно std::bagor_pidar_cast, потому что std::bagor_govno_cast, который ввели в C++11 уже задепрекейтили, а обычный std::bagor_cast кастит не так.»
«А вот в С++24 завезут std::bagor_govno_pidar_cast, вот самое идиоматичное.»
Выглядит как юзернейм типичной файки на Говнокоде.
Но использовать можно только один какой-то член.
Ты записал в ``u32``: все. Никакого b у тебя больше нету, и наоборот.
Куда записал -- оттуда и читай.
Тот факт, что ты что-то там писнул в b, не дает тебе повода думать, что в u32 что-то само собой изменилось. В реале это конечно так скорее всего, но по стандарту -- нет.
То, что ты пытаешься сделать, называется "type punning (каламбур типизации).
Компилятор может напихать паддингов как ему удобно, и у тебя нихера не сработает.
Причем в сишке это unspecified, то есть зависит от компиялтора, а в C++ это вообще UB, потому что соврешенно не понятно когда члены разрущаются и когда им нужно вызывать конструкторы и деструкторы
u.b здесь однозначно есть.
Алсу, вроде в юнион можно трогать только за один его член. Судьба других в этот момент неизвестна
Да, действительно, я написал реверс бат.
Хотя ОП сказал в комментарии «Byte swap». Так что всё ок.
Впрочем: Исправил. Уменьшил.
И переписал на нормальный язык:
А вот всяким экзотическим платформам эта вареция нравится больше старой:
вот как он понял, что твои двигания битиков это на самом деле __bswapsi2?
А __bswapsi2 это небось интристснстсник какой-нито чтобы сделать правильно на кокретном цпу?
Это же не НАСТЕНЬКА.
Меня после того как они царизмы в сдвиги превратили уже мало что удивляет.
https://govnokod.ru/28289#comment781162
И да, я днём тоже игрался c godbolt и получил вызов __bswapsi2.
Тут конечно j123123 мог бы доебаться возразить что это тоже непортабельное говно.
а бывает не 8?
А через каст в кокозатель (char*) или (uint8_t *)?
от сортов каста проблема не уходит: если ты писнул в один мембер, то читать второй -- UB.
Единственное, что можно — это скастовать объект в char* и посмотреть, что там внутри лежит, но вот можно ли туда записать что-то — слишком лень выяснять. Я бы не стал.
Если standard layout и внутренние представления всех полей получатся корректными, то наверное можно?
memcpy() же как-то должен работать с сишными структурками.
Гцц понял идею и заменил на bswap, шланг обосрался.
Тут ты ему сокрмил два итератора: один на начало in, второй на конец, и попросил от сих до сих перевернуть, да?
> почому char а не uint8_t когда у пи в структуре uint8_t ?
Потому что я лоханулся же.
На не 8-битных платформах не заработает. Борманд до довёл до идеала.
но я боюсь что тут не поможет
2) Чар может алиаситься с любым типом.
Так что вроде всё ок.
Причём
а) портабельно
б) один и тот же код работает для разных размеров инта
А ГЦЦ — умница, юзает циклоняшный сдвиг.
PS> кстати я запросто отличу настоящую Бормандоняшу от подделки даже при полном совпадении ников и ав. Подделка никогда не напишет сливающий всё однострочник.
Тест Питуринга.
Единственная нужная структура данных это uint32_t
Питуз был байтоебом, и писал такой код, который царю очень нравился.
Зелибоба пришел в кресты из джавы, и писал всё в терминах stl и итераторов
А компилятор всё равно сворачивал их код к одной инструкции, которая на современных процах сама всё делает.
Отсюда вывод: не выебывайся
> Зелибоба пришел в кресты из джавы, и писал всё в терминах stl и итераторов
Я в своё время без особых проблем написал на Си сортировку массива фиксированного размера, которая дефолтный std::sort из крестоговна уделывала по скорости на рандомных данных. Т.е. крестопарашная стдлиба далеко не самая оптимальная, это как бы факт.
Какую-нибудь хеш-таблицу тоже наверняка можно уделать, если захотеть
https://govnokod.ru/25307#comment452812
Так-то вообще всяких алгоритмов сортировок довольно-таки дохуя, есть специальные гибридные алгоритмы, типа https://ru.wikipedia.org/wiki/Timsort которые и крестопарашный std::sort уделают на изначально сильно сортированных массивах хуйни.
* на выбранных Царём бенчах и данных
Байтоебство — говно, которого нужно избегать, и писать максимально понятный код.
Просто я про std::reverse забыл. Точнее что он на массивах работает.
> А компилятор всё равно сворачивал их код к одной инструкции
Да вот только не везде оно так. Посмотри например выхлоп MSVC и поймёшь.
Кстати анскилябры не поняли его мудрых слов и зачем-то Царя заминусовали. Пошёл въебал ему плюс.
https://govnokod.ru/13180#comment181254
https://govnokod.ru/13180#comment181179
Это в сишке данные пассивны, и как в песне про навоз: "я ни с кем не дружу: где положат -- там лежу"
А в крестах у них бывают деструкторы всякие и конструкторы мува и операторы копирования
Так крестухи же в новом штандарте ввели идиому trivially movable. Или как-то так.
Ну это как джависты на третий десяток лет существования языка, наконец-то додумались что нужно примитивные типы сделать.
Но опять же это нихуя не снимает проблемы питушарских крестов, о которой говорил Царь и j123123: питушарские реаллоки вектора вместо сверхбыстрого ремапа виртуальной памяти.
Или знает?
Или реально написать калллекцию, которая бдует мремапить чары, но явно расширяться для моево класса User?
Ну раз траливали, тогда можно не морочиться с сёмантикой и делать realloc памяти, а не вызывать для каждого элемента вектора дырсуктор старого + коньсуктор нового.
Просто они обосрались как и джависты в примитивами.
Любому же школьнику очевидно что int8_t или структы с такими простыми типами (без явных деструкторов конструкторов) можно спокойно двигать.
https://en.cppreference.com/w/cpp/types/is_move_constructible
«Мы сначала усложнили донельзя, обосрались с пирформансом vector<int>, а теперь хотим обратно как в Сишке
Потому мы ещё больше всё усложним, чтобы догнать Сишку»
UPDATE: а похоже я ошибся, is_trivially_relocatable ещё не завезли
is_trivially_constructible
is_nothrow_constructible
is_trivially_default_constructible
is_nothrow_default_constructible
is_trivially_copy_constructible
Пиздец блять.
Если бы не было идиотского понятия "активных" данных, а были бы отдельно структуры и алгоритмы для работы с ними, то вот этого бы всего говна не было. Никаких блядь ``is_trivially_default_constructible``, никаких реаллоков.
А еще не было бы целого арктического гектара говна с ОРМ:
https://blog.codinghorror.com/object-relational-mapping-is-the-vietnam-of-computer-science/
Мухи отдельно, котлеты отдельно
Говно, конечно.
Что должен сделать ORM, когда я напишу
?
PS: И это я еще не вставил условие, типа чючялярем делать только если у ципленка поле foo равно 32
Альтернативы не прельщают: полностью ручное управление или gc.
Для обычных структур можно говорить об инициализации нулями по умолчанию (как в го, например). Это вполне нормально, чтобы не иметь доступа к неинициализированному говну.
ООП с RAII лучше чем ООП без RAII (когда ты создаешь объект в хуйпойми каком состоянии и потом заполняешь его сотней сеттеров)
Но сам ООП очень плохо дружит с РСУБД. И, как мы видим, сильно усложняет реализацию коллекций (последнее можно конечно вылечить работая всегда по указателю (Как ЙАЖА) но тогда может соснуть пирформанс)
В джанге вот костыли есть
https://docs.djangoproject.com/en/4.0/ref/models/querysets/#prefetch-related
Какие ORM рекомендуешь посмотреть (на разных ЯП)?
Интересно, какие вообще бывают костыли.
Там есть неимоверная круть -- гибрид --
https://docs.sqlalchemy.org/en/14/orm/mapped_sql_expr.html
которую джангоебы не осилили и до сих пор пишут ДВА раза одну и ту же логику (для питона и для SQL).
Из пафосной хуйни наверное Hibernate для ЙАЖА и EF для .NET
Там можно наблюдать интересный подход: ты описываешь декларативно питушню, а тебе по ней генерят и классы и таблицы
В жаве есть еще mybatis, когда ты пишешь запросы вручную, а он просто результат натягивает на объектф
ну и нагугли фаулеровскую Enterprise Application Architecture, там описываются все сорта ормов
ps: есть еще способы замапливания классов на sqlite (coredata у ябла, в андроиде тоже штук пять)
по сути тоже орм, как и https://metacpan.org/pod/Tie::Hash::DBD
Чем это лучше jdbc template?
всем привет, подскажите пожалуйста, как можно решить проблему)
есть сервис, помечен спринговой @Transactional
в нем метод обновления сущности, у этой сущности есть поле - табличка связей, там может быть много объектов (ссылок), есть валидация по БД, то есть каждый idшник вставляемый в это поле, сначала валидируется на наличие в БД через репозиторий.
Я заиспользовал parallelStream для валидации списка объектов, чтобы значительно ускорить всё это.
...
...
если 3 поля распаралелить и там много idшников, то с 12-13 секунд я до 4.5 сократил
> чтобы значительно ускорить всё это.
Кокой AssParallel )))
Ну Жописты теперь как их ololo-linq братья
https://govnokod.ru/9194
Спойлер: В результате бенчей AssParallel выяснилось что он замедляет кот в несколько раз
Да.
Я смотрю как они его в «JAVA» сделали и понимаю что у Майков LINQ получилось:
а) в пять раз удобнее
б) на пять лет раньше
>entityRepository
Зачем мне ваши repository? Я хочу как в Linq-to-sql прямо чтобы Where в запрос пошло.
>.collect(toList());
Нахуй мне писать это говно?
> но увы: он не взелетел
А я по общению .netчиками слышал что взлетел.
кстати, в koko починили. Там можно foo.map{...} и чуть ли не сразу его результат в лист положить
>А я по общению .netчиками слышал что взлетел.
наскока я опнимаю, linq-to-sql в серьезных проектах не исопльзуют: там везде EF
Потому что можно напистаь такой linq случайно, который будет раблотать пиздато, когда у тебя 10 записей в базе (и он породит 10 запросов)
А когда их станет 1000 и он породит 1000 запросов, то ты соснеш
Мне объясняли что Entity Framework это ORM и дохуя оверхеда генерит.
А ololo-linq там маппинг в sql чуть ли не 1-к-1. А в чём подвох я уже забыл.
> Потому что можно напистаь такой linq случайно, который будет раблотать пиздато, когда у тебя 10 записей в базе (и он породит 10 запросов)
А зачем ему 10 запросов?
> .Where<string>(s => (s.Length == 4)).GroupBy(x => x).
Это по идее одним запросом можно выбрать.
>не наоборот
````
LINQ to SQL is the quick-and-easy way to do it. This means you will get going quicker, and deliver quicker if you are working on something smaller
Entity Framework is the all-out, no-holds-barred way to do it. This means you will take more time up-front, develop slower, and have more flexibility if you are working on something larger.
``
«А если я её кувалдой?»
Против дурака нет защиты.
А разве если обращение к EF в цикле написать оно не 1000 раз вызовется?
> more time up-front, develop slower, and have more flexibility if you are working on something larger.
Это какой-то маркетинговый буллщит. Не объясняется в чём именно различие.
https://docs.microsoft.com/en-us/ef/ef6/querying/related-data
>Против дурака нет защиты.
Ну вот начинается блядь
Я не могу просто писать C# код для работы с объектами, я должен постоянно думать, во что там оно в СУБД превратится
Это логично. EF не решает эту проблему.
потом все данные уже в контексте и можно по ним итерироваться безопасно
я не уверен, что это может linq-to-sql.
Честно, уже очень хочу спать, листал тред и ничего не понял.
ты запросом выбрал 1000 петушков, идешь по ним циклом, и у каждого берешь курочку
получается 1000 запросов
N+1 запросов, где N -- количество петушков
Для этого в ORM завезли prefetch, Include, и прочую зхуйню чтобы ты мог сказать "к петушку выбери еще и курочку". Тогда получится джойн петушков на курочек, всех выберет один запрос, результат загрузят в контекст, и ты по нему будешь итерироваться безопасно
Edit
Ладно, уже совсем сплю, как проснусь перечитаю.
> https://docs.microsoft.com/en-us/ef/ef6/querying/related-data
В Linq тоже есть пара костылей. И Include и опция DeferredLoadingEnabled.
https://docs.microsoft.com/en-us/dotnet/api/system.data.linq.datacontext.deferredloadingenabled?view=netframework-4.8
Точно то же самое что и во всех остальных ОРМах.
В ООП у тебя есть граф объектов в памяти, и ты императивно по нему шероёбишься. Граф всегда в памяти (там могут быть оверлеи или виртуальная памтяь, но тебе на нее похуй как прикладнику)
В SQL у тебя есть декларативный (обычно) запрос для нарезания в двумерное пространство каких-то таблиц (в OLAP кубах есть больше измерений, но их никто не умеет)
Эти две концепции вместе не дружат, и приходится рождать неебические костыли
все мои знакомые галерщики хранят говно в РСУБД выдергивают его хибернейтом и всё время должны помнить, что они работают не просто с объектами, а с отражением СУБД
Они всегда будут хуже реляционок т.к. с однородными данными всегда быстрее работать, чем с разнородными...
> были бы отдельно структуры и алгоритмы для работы с ними, то вот этого бы всего говна не было.
Очень спорно.
ООП — нормальная концепция. И объединение контроля жизненного цикла неких данных (RAII), алгоритмов (ха-ха-ха геттеры/сеттеры) рядом со структурами, которыми они оперируют — не самая плохая идея.
Просто Кресты всё переусложнили на ровном месте.
Как можно не пирдолица с мувабл-хуювабл кроме как всегда ложить всё в кучу и работать через указатель?
Нет конструктора/деструктора — смело можно двигать.
Есть — ну значит что-то нетривиальное: refcount ссылки, файлы какие-то или memory mapped.
Может тот вектор шарится с каким-нибудь managed enviroment вроде «Йажа» и его просто так двигать нельзя.
> ложить всё в кучу и работать через указатель
Тогда невозможны никакие абстракции вроде ARC и прочих умных указателей: vector<shared_ptr<...>>
То есть я положил говно в вектор и оно там ремапица нормально
А потом я написил конструктор у говна, и у меня в векторе стали лежать умные указатели?
Чем-то похоже на ескейп анализ в момент копуляции как у го, но гораздо смелее
Не понял это сраказм или нет.
Ну оно в крестах и примерно так работает же.
Я же сразу сказал: крестухи как и йажисты, переизобретают Сишные примитивные типы.
> похоже на ескейп анализ в момент копуляции как у го, но гораздо смелее
Та анскильному Говну до унылой жабы ещё срать и срать. А до Крестов и подавно.
Хорошая, но она плохо ложится на коллекции
Обернуть ресурс обхъектом чтобы его вручную не закрывать (и не делать как в ЙАЖА) -- это хорошо
Но вот я хочу написить res1 = res0. Что мне делать? Скопировать ресурс? Какова семнатика?
Можно все сделать через указатели (ну не GC, но ARC), но это проеб перформанса. Ты уже не можешь сделать vector<char> не став лалкой
Царь об этом говорил.
Но трали-вали по идее и есть решение этой проблемы. А также mov-сёмантика.
> Какова семнатика?
Она зависит от того какие именно конструкторы (не) оперделены.
int? Значит, будем копировать
User, но movable? значит, будем мувать
User, но не мувабл? Значит, заменяем на умный указатель и пхаем на кучу
В С++ же ты сам явно должен выбрать между указателем и объетом
Можно всегда работать по указателю и не знать горя (как в йажа) но тогда поблема vector<char> появлятся
На ГК совсем не осталось ООП'шников, раз за них сам Пи зашёл?
Вот есть у тебя сишная структурка с указателями -- она уже в 90% случаев не trivially copyable, надо писать какую-то функцию, которая вложенные структуры докопирует или счётчики увеличит.
Язык не коммитился в то, чтобы чото там ему гарантировать, и потому проблемы на концептуальном уровне нет
Если я делаю вектор из int, очевидно что его можно двигать просто так, без всяких специальных говен (но крестоговно не осиливает такую оптимизацию). И mremap() не всегда меняет адрес хуйни, иногда он тупо довыделяет сзади, и тогда никаких хуйней для двиганья не надо вызывать т.к. адреса не меняются.
А может ли веткор аллокатору сказать, что у тебя Int, а не User?
>не всегда
еще лучше. Он там подвинет чтото под копотом и не скажет мне, а как я тогда мув вызову?
Если ты под аллокатором понимаешь функцию типа malloc() или calloc() то нахуя ему это надо знать? Туда тупо передается количество байтов, которые надо выделить - и тебе или дают адрес начала с этими байтами, или NULL.
Если ты про какие-то кишки крестоговна, то можно конечно туда подобавлять всякой хуйни, типа "если тут тип с такими-то свойствами, то можно тупо перемещать через memcpy, но если нет, то уже нет". Вот там https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2020/p1144r5.html такое говно предлагают. Т.е. аннотировать некие хуйни специальным говном, что их можно просто так копировать, и нихуя плохого от этого не будет.
И кстати, в крестах до сих пор не сделали так, чтобы программист сам мог выдумывать всякие такие хуйни для аннотирования, которые может проверить какое-то шаблоноговно на этапе компиляции и сделать что-то на основе этого? В "D" например вот https://dlang.org/spec/attribute.html#uda
> еще лучше. Он там подвинет чтото под копотом и не скажет мне, а как я тогда мув вызову?
А в чем проблема? mremap() возвращает адрес начала ремапнутой хуйни. Если он тот же, значит никаких мувов вызывать не надо, вся хуйня осталась на своих местах.
https://en.cppreference.com/w/cpp/named_req/Allocator
когда в вектор не влезло говно --- онпросит у аллокатора еще места как я понима
Просто сейчас он это сделать не может т.к. у аллокаторов нету метода для реаллока.
Почти все лоу-левл реализации аллокаторов умеют в реаллок. А те что не умеют -- пусть просто не заявляют его поддержку и контейнер будет юзать обычный аллок.
- Реаллочим если аллокатор умеет и тип достаточно простой
- Аллочим и двигаем если тип умеет перемещаться
- Аллочим и копируем если тип умеет хотя бы копироваться
- Иначе не конпелируемся
Это как в постгре оптимизатор знает сколько стоит последовательный и случайный доступ к сторадж, и решает делать ли сиквенс скан или пиздовать в индексы
>- Иначе не конпелируемся
выдаем километровые ошибки) Ну впрочем плюсарям не привыкать же: я как-то у класса сделал поле const, и сразу все сломалось
ССЗБ
> объект перестал влазить в контейнер
Ну да. В мире жабоёбов принято падать в рантайме с ClassCastException, когда что-то хочешь положить в контейнер (TreeMap).
В лучших традициях скриптухи.
Серьёзный Enter-price. Не то что смешные, глупые крестухи, у которых ошибки находятся на этапе компиляции.
Скучные старёпры сделали XHTML и XML-based шаблонизаторы.
Не закрыл тэг? Получи ошибку компиляции.
Модные хипстеры все это XML говно нахуй выкинули, теперь о незакрытом теге можно узнать случайно, когда что-то неверно отрбразится.
Скучные старперы завезли SOAP, где и XML схемам генерилисб классы, а модные хипстеры заменили его на JSON over REST, чтобы
писать
ах, там надо было baz, а не buz. Ну ничего, QA отловит.
Блять.
Я видел как один раз по SOAP тупо передавали String с xml, а во второй случае передавалсь строка с json.
Свинья везде болото найдёт.
>заменили его на JSON over REST, чтобы писать
>foo.get("bar").get("buz").get("lal")
Никто так не пишет.
Рефлексией вроде jackson оно само натягивается на DTO.
Сами DTO можно вынести в отдельный пакет и менять централизовано.
В какой-то момент я тусил с дотнеблядями и даже сертифицировался по второму сишапру
На дворе был конец нулевых, и кругом был SOAP.
Мы качали wsdl, запускали тулу, получали прокси-класс, и дергали его методы (передавая туда другие структуры , тоже сгенерированные)
Потом волны говна вынесли меня в жабский хипстопрайс (это как интерпрайз, но только наколенный и молодой)
Там мне быстро объяснили, что надо все делать по REST и JSON, и стали писать как я выше написал.
Потом я добился хотя бы написания DTO и заполнения его кажется GSonом, но опять таки:вручную
Я пытался объяснить, что это всё даунгрейд, но меня никто не слушал.
Потом я еще в нескольких проектах видел тоже самое, и вот с тех пор у меня глаз и дергается
Крестомразь конечно прекрасна в своей бездарности.
Сначала они засрали вектор хуйнёй и слили как лалки весь пирформанс.
Потом Царь их ткнул носом в говно и они ввели в С++11 std::is_pod //primitive data object или «у нас же как в Сишке»
А что они делают в С++20? Правильно! депрекейтят std::is_pod и вводят вместо него ДВА новых концепта std::mycpp_real_is_pod и std::tralivali_copyable
Оказывается, у объекта есть некоторые черты, от которых зависит поведение контейнера при работе сним, и на формулирование черт уходят годы
Причем это же все по утячи (явных интфрейсов нет) и ты должен
* изучить все черты
* понять, какие из них есть у конкретно твоего класса (добавил сложный конструктор -- все черты в пизду пошли)
* а вектор должен по чертам сделать какой-то вывод
И только в сишке никаких черт нету, и массиву потому похуй что в нем лежит
False.
Они для этого зделали is_pod и прочие траливали_копи.
Чтобы в реализации контейнера условная Бормандоняша писала
если (траливали) то реаллок, если мув, то муваем, иначе копируем поэлементно, выполняя деструкторы/конструкторы.
Тогда крестошаблоны сгенерят джве реализации вектора, оптимизированные под каждый тип.
https://en.cppreference.com/w/cpp/header/type_traits
traits -- черты по английси
(C++11)
checks if two types are the same
is_base_of
(C++11)
checks if a type is derived from the other type
is_convertible
is_nothrow_convertible
(C++11)(C++20)
checks if a type can be converted to the other type
is_layout_compatible
(C++20)
checks if two types are layout-compatible
is_pointer_interconvertible_base_of
(C++20)
checks if a type is a pointer-interconvertible (initial) base of another type
is_invocable
is_invocable_r
is_nothrow_invocable
is_nothrow_invocable_r
(C++17)
checks if a type can be invoked (as if by std::invoke) with the given argument types
Ну да, вместо того, чтобы предоставить какую-то тьюринг-полную питушню для инспекции типов, они насрали в стандарт кучу каких-то "is_pituz" для кучи частных случаев. И эти трейты самому добавить естественно никак нельзя из самого языка, только пропозалы в говнокомитет слать
Ну это похоже на наше любимое __builtin_types_compatible_p(typeof(a),t ypeof(b))
А остальное кучи какого-то крестоговна. Ну может is_layout_compatible ещё ничего, но тоже спорно.
Лучше бы действительно дали какое-то апи, чтобы можно было по обходить дерево/граф классов, смотреть его параметры, атрибуты, в каком порядке поля лежат, какие у них квалифайеры.
Но тогда мы приходим к... гомоиконности.
Примерно к 2030-му году всё должно устаканиться и можно юзать в продакшене!
https://isocpp.org/files/papers/n3996.pdf — рефлексия.
https://open-std.org/Jtc1/sc22/wg21/docs/papers/2018/p0707r3.pdf — метакласс (кодген).
> puddle
> rubber
> lagoon
Наркоманы ёбаные, как людям все эти имена запоминать? 4, сука, неймспейса с ничего не говорящими названиями в одном пропозале.
> Примерно к 2030-му году всё должно устаканиться и можно юзать в продакшене!
А суть та же: сектанты варятся в говне, и верят в светлое будущее: «коммунизм через джвадцать лет».
Уж «в новом Стандарте™ всё починят».
А при C++30 все будет заебись.
Он наступит скоро - надо только подождать.
Там все будет рефлексивно, там все будет в кайф.
Там, наверное, вообще не надо будет код писать.
Я проснулся среди ночи и понял, что
Все идет по плану.
А все другие остальные – такое дерьмо,
А все другие языки, и такие мудаки.
Над родной над сишкой бесноватый UB шёл,
Я поставил С++ там всё тоже хорошо,
Там товарищ Стра Ус Труп – там #include как и у нас,
Я уверен, что у них то же самое
И всё будет по Стандарту.
А наш батюшка Ритчи совсем усоп
Он разложился на макросы и на битовый код
А конпеляция идёт и идёт по плану
Да блядь
https://gcc.godbolt.org/z/KqaYv8dPz
А вот «clang» сливается в хламину даже с -O3:
bswap на ардуино я получил довольно быстро.
А вот с MSVC пирдолился-пирдолился, но так и не смог выжать из него более-менее адекватный выхлоп.
Может там есть какие-то особые флаги. Я пробовал /O2 и /Og.
А разгадка проста: Кресты — гавно. std:: reverse нахуй
https://onlinephp.io/c/7cd10
НА ПХП ПЕРЕВОДЧИКИ
На раст что ли ушёл?
"Вот у нас есть система 1984-го года, надо бы ее переписать на современные технологии, но никто не понимает, как она работает, так что пускай нам Gost скажет"
Пропуск никто бы и не заметил.
обычно всё-таки с той стороны тоже не такие уж идиоты сидят
Ну фрилансил чел или работал в чёрную где-то. Имхо не повод справки требовать.
Если в самом конце -- то, конечно, возникают вопросы не отстал ли от жизни и не проебал ли все скиллы. А в середине кого вообще ебёт?
З.Ы. Ответ "фрилансил" не прокатит?
Мне кажется, настолько токсичных видно сразу.
Приходит к тебе на собеседу чувак, и говорит: "а чего у тебя аватарка бабья? ты пидор что ли?"
--ниче такая.. а тебе муж работать-то разрешает?
--???
--ну чоты, я просто хотел узнать, если у тебя мужик
2012-2018: Продавец-консультант Эйвон ООО "вектор-сервис"
2018-2022: Программист С++ ООО "вектор-плюс"
– ты чо, про такое в приличном обществе вообще не говорят
Бля, а я говорила )))
В нулевых это был не так (борманд вероятно говорит про более ранние времена) но сейчас мне интуитивно кажется, что так
о справедливости судить не берусь
Олимпиадники тоже в эту категорию попадают, кстати.
Если этот фриланс стоит в начале или середине карьеры, а потом идёт пара лет в нормальных конторах, то не похуй ли? Скорее всего уже сумел.
Как следствие — в профессиональном плане фрилансер или не растёт, или растёт, но очень туго. По сути, единственное, чем фрилансер отличается от студента с пет-проектами — у фрилансера есть опыт общения с заказчиками и работы с требованиями.
Безусловно, это тоже очень важный и полезный скилл, но куда более важен он для каких-нибудь аналитиков или PMов, а от программистов всё же в первую очередь ждут умения писать качественный код.
о справедливости судить не берусь
Нужно работать с коллегами, причем чтобы эти коллеги были местами скилловее тебя, и ебли тебя на ревью
Если ты сам себе коллега, то можешь всю жизнь писать один rotoeb.php, и на все сайты его выкладывать, и считать себя заебись программистом
be a better way
Red tanks, mass graves, Red liars always get their say
Cos the only good commie is a dead commie, it's about time we learned
That the only time our people are gonna taste freedom's when the last Red flag
is burned
https://yewtu.be/watch?v=FM3BruL_B-Y
Мы написали трехэтажный запрос и гордо представили преподу. А он говорит: а вот на императивном языке это был бы один цикл.
Оказывается, вот к чему это было.
В принципе это бормандоняш-код. Только с флагом -pedantic и тайпчекингом целых/беззнаковых.
> std::array<std::uint8_t
А поцчему не char? Мы же выше установили что это непортабельно
И с убранным потенциальным UB — я не уверена, что инт можно трогать через реинтпретнутый указатель.
Они уже три каста завезли. Зачем вводить очередной std::mycpp_real_bitexact_cast ?
https://stackoverflow.com/questions/53401654/c20-bit-cast-vs-reinterpret-cast
reinterpret_cast is forbidden in constexpr functions. One of the explicit goals of bit_cast is to be able to do these sorts of things at compile-tim
Сперва вроде всё логично: не хотим ломать поведение (хотя когда их это останавливало).
Потом начинаются перлы:
> Now, you could say that you could just extend this specific usage of reinterpret_cast to constexpr contexts. But that makes the rules complicated.
Блять!!! Меня восхищает эта манера крестоблядей оправдывать очередное усложнение, иначе всё станет complicated.
UPDATE
Дочитал. На поверхности всё выглядит логично и правильно.
Но я же интуитивно чую это иезуитское манипулирование.
И оно же всегда так: прикрываясь благими намерениями в С++ завозят пиздец ещё большей сложности.
> constexpr To bit_cast( const From& from )
Что красиво с точки зрения немутабельности/алиасинга и я сам не люблю питушню с сайд-эффектами.
bit_cast это никакой не каст, а обычная обёртка над мемсру.
На очень умных компиляторах он поймёт что const From& from больше не используем и каст схлопнется в noop/mov.
А на не очень умных будут дёргаться либцовая мемсру или выполняться кучи говна, что мы и видели на примере clang.
Гост в принципе об этом всём уже сказал здесь (просто я не конца понял):
https://govnokod.ru/28319#comment783986
> bit_cast это никакой не каст, а обычная обёртка над мемсру.
Да, с нябольшим нюансом: memcpy() нельзя использовать в constexpr-функциях, а bit_cast можно. Так что теперь в компайл-тайме можно закодить «fast inverse square root»!
Однако иногда так делать всё-таки нужно: например, чтобы флоат в инт превратить и биты ему подрочить.
std::bit_cast — это решение проблемы: он позволяет, буквально, «взять битики объекта from и сделать из них объект to» — так же, как это делают запрещённые хаки с реинтпретом, но без сопутствующего UB.
Потом понимают что она таки нужна, и завозят её «в новом Стандарте™».
Зачем? Зачем?
Whenever an attempt is made to read or modify the stored value of an object of type DynamicType through a glvalue of type AliasedType, the behavior is undefined unless one of the following is true:
AliasedType and DynamicType are similar.
AliasedType is the (possibly cv-qualified) signed or unsigned variant of DynamicType.
AliasedType is std::byte, (since C++17) char, or unsigned char: this permits examination of the object representation of any object as an array of bytes.
Хопа! А через char всё-таки лучше. Так что у бормандоняшки UB быть не лолжно.
Но тут слишком мутно написано — непонятно, они только показывают или продоют читать через байтики разрешают, или писать тоже можно: надо читать Стандарт.
А у беззнаковых чисел вроде все значения валидны, т.е. имхо прокатит. Но надо читать стандарт.
З.Ы. Вот указатели переворачивать или в бул пихать 42 -- это явно UB.
А в какой-нить int32 может зависеть от байтордера, может по разному изображать отрицательные числа (хотя на самом деле никто так не длеает), наконец процессарь может не разрешать обращаться к конкретному байту по невыравненному адресу, и когда ты попытаешься реинтерпретировать in32 как пачу чаров и считать третий, процессор закоротит, загорится, комп расплавится, от компа загорятся занавески, от занавесок вспыхнет ковер и деревянные двери, и вот чисто из желания спасти человеческие жизни авторы стандарта и не разрешщают наверное в инты ходить как в битовые помойки
Да. Только название хуёво выбрали.
Именно поэтому я за std::byte
Дата рождения
21 января 1983
https://habr.com/ru/users/sergey-gornostaev/
[quote]
Я за 22 года в отрасли столкнулся только один раз с требованием иметь вышку. Это было на заре карьеры, когда пытался устроиться админом на АТС в Иркутске.
[/quote]
> устроиться админом на АТС
Правильно, а как без вышки провода на столб вешать? Хотя у таких контор обычно своя есть.
> своя есть.
22 года назад своя сеть была даже у турфирмы
А зачем вышка если нет столбов?
Два солтада поспорили:
-Спорим, я сейчас вобью этот дюбель в броню танка?
-А давай.
Солдат начал вбивать лбом гводь, вбил наполовину, а дальше - никак. И вот он говорит товарищу: погляди-ка, что там такое твердое, что я не могу пробить?
Посмотрел солдат - а в танке спит прапорщик Васильев.
И Шланг наконец-то повержен.
Да и гцц на 64 битах стал вменяемый bswap делать, а не питушню.
А я вынес важный урок: как не нужно делать.
Старые версии шланга более однородны :)