Нашли или выдавили из себя код, который нельзя назвать нормальным,
на который без улыбки не взглянешь?
Не торопитесь его удалять или рефакторить, — запостите его на
говнокод.ру, посмеёмся вместе!
Ну вот и я об этом. Для 99.99% программ это просто уникальные 16 байт без какой-либо структуры.
Но все пердолятся с парсингом "полей" разной длины, разделённых чёрточками. Обратная совместимость такая обратная совместимость. Там вроде время когда-то было и ещё что-то.
Был RFC с классами UUID'ов. Номер класса обозначался где-то в самой середине. Так вот в одном классе где-то в середине было время, в другом — ещё какая-то фигня.
The version number is in the most significant 4 bits of the time stamp (bits 4 through 7 of the time_hi_and_version field).
Оказывается, у UUID, описанного в RFC, ещё куча вариантов.
1 The time-based version specified in this document.
2 DCE Security version, with embedded POSIX UIDs.
3 The name-based version specified in this document that uses MD5 hashing.
4 The randomly or pseudo-randomly generated version specified in this document.
5 The name-based version specified in this document that uses SHA-1 hashing.
И получается, что для версий 3, 4, 5 поля Timestamp и Clock Sequence содержат не время, а псевдослучайное число (версия 4) или хэш от какой-нибудь питушни (MD5 или SHA-1).
Самое страшное, что та древняя версия 1, которая содержала время, в поле Node должна была содержать MAC-адрес основного сетевого адаптера данной машины, т. е. UUID получался не совсем случайным.
Надо просканировать ууиды из разного софта, отфильтровать первую версию, тогда есть шанс восстановить маки, принадлежащие разным компаниям (если, конечно, разработчики софта не догадались вместо реального мака вставлять фейковый).
Сейчас ещё бывают багры из-за китайских мобильников, которые каждые полчаса меняют мак на случайный. Вроде даже у «Айфона» есть такой режим. Теоретически это может вызывать коллизии между пользователями одной точки доступа.
Но AP тебя не узнает, и может выдать другой IP, например.
А дома его не узнали и не пустили в квартиру.
— Я столяр Кушаков! — закричал столяр.
— Рассказывай! — отвечали из квартиры и
заперли дверь на крюк и на цепочку.
Столяр Кушаков постоял на лестнице, плюнул и пошел на улицу.
Кстати в жабе ууид до последнего времени был стремный, с маком и сиквенсом. Чтобы на одной ноде, сука, все были похожи, как сестры в-очёвски, а ты такой ищешь где там разница в 25 разряде. Дико бесило всегда, и лень проверять, стало ли лучше.
Именно так. В остальных строчках ты пишешь std::move() вручную, чтобы случайно не спиздить значение. А в момент return'а уже всем пофиг.
> Не обязан
Ну да. Но, тем не менее, многие на это надеялись. Иначе вместо возврата придётся юзать явное void foo(Petuh &out), а это некрасиво.
> не копируемый тип
Это да. Почти все оптимизации так работают. Сначала проверяется, что при стандартной семантике всё ок. А потом уже код выбрасывается. Более того, твой второй вариант тоже не работает если нечем копировать и/или мувать, проверь.
Хуёво жили. Нельзя было например открыть файл и потом куда-то задвинуть или вернуть. Надо было сразу его создавать вложенным в нужное место или на куче.
На самом деле, писать на крестах до с++11 - тлен и безысходность.
А что было в 10-й студии? Не было C++11?
Тогда там и мува не было, тогда вообще можно было соснуть. А в С# уже тогда можно было все;)
out был еще 15 лет назад вроде
>И зануление во всяких указателях да контейнерах уже есть.
Ну если это умный поинтер, то да.
А если это моя обертка вокруг внешних ресурсов, то брать MFC нужно быть оккуратным
да, я уже понял главную мудрость RAII: думать нужно при насписании конструкторов, операиторов присваиваня и десктруторов. Причем неподдерживыемые штуки лучше явно запретить.
А когда все это сделано -- кресты уже дальше сами все сделают правильно
Steve_Brown # 0
- Леонид Ильич, переверните, у нас бумага кончилась, и мы вам речь на программистской оборотке напечатали...
Myxa # 0 ⇈
Steve_Brown # 0 ⇈
DypHuu_niBEHb # 0 ⇈
bormand # 0
defecatinho # 0 ⇈
bormand # 0 ⇈
defecatinho # 0 ⇈
bormand # 0 ⇈
defecate-plusplus # 0 ⇈
В ОП десериализация же в 128-битное значение, не?
bormand # 0 ⇈
Ну вот и я об этом. Для 99.99% программ это просто уникальные 16 байт без какой-либо структуры.
Но все пердолятся с парсингом "полей" разной длины, разделённых чёрточками. Обратная совместимость такая обратная совместимость. Там вроде время когда-то было и ещё что-то.
defecatinho # 0 ⇈
bormand # 0 ⇈
defecatinho # 0 ⇈
defecatinho # 0 ⇈
The variant field determines the layout of the UUID.
Значение 100 и 101 (двоичное) поля вариант означает юниксоидный UUID, описанный в RFC, который содержит время.
Значение 110 означает UUID, совместимый с «Микрософтом».
Другие варианты с точки зрения того RFC зарезервированы.
defecatinho # 0 ⇈
The version number is in the most significant 4 bits of the time stamp (bits 4 through 7 of the time_hi_and_version field).
Оказывается, у UUID, описанного в RFC, ещё куча вариантов.
1 The time-based version specified in this document.
2 DCE Security version, with embedded POSIX UIDs.
3 The name-based version specified in this document that uses MD5 hashing.
4 The randomly or pseudo-randomly generated version specified in this document.
5 The name-based version specified in this document that uses SHA-1 hashing.
defecatinho # 0 ⇈
inkanusinho # 0 ⇈
defecatinho # 0 ⇈
defecatinho # 0 ⇈
inkanusinho # 0 ⇈
http://govnokod.ru/26969#comment578025
bormand # 0 ⇈
defecatinho # 0 ⇈
bormand # 0 ⇈
Эээ... дык тогда вся суть пропадает, он уже не уникальный будет. Хотя китайцы и так поди поднасрали с сетевухами, у которых одинаковый мак.
defecatinho # 0 ⇈
DypHuu_niBEHb # 0 ⇈
AP пошлет отконнектит STA коли ты смениш мак
bormand # 0 ⇈
DypHuu_niBEHb # 0 ⇈
Но AP тебя не узнает, и может выдать другой IP, например.
А дома его не узнали и не пустили в квартиру.
— Я столяр Кушаков! — закричал столяр.
— Рассказывай! — отвечали из квартиры и
заперли дверь на крюк и на цепочку.
Столяр Кушаков постоял на лестнице, плюнул и пошел на улицу.
DypHuu_niBEHb # 0 ⇈
кстати, ты не инью
inkanusinho # 0 ⇈
Сразу видно, да?
DypHuu_niBEHb # 0 ⇈
икарус спзидил твой акк
defecatinho # 0 ⇈
DypHuu_niBEHb # 0 ⇈
мироздание наказало тебя, спиздив твой
Олень подстреленный хрипит,
Лань, уцелев, резвится,
Тот караулит, этот спит -
И так весь мир вертится…
bormand # 0 ⇈
DypHuu_niBEHb # 0 ⇈
Нахватаешься тут у вас
defecate-plusplus # 0 ⇈
Кстати в жабе ууид до последнего времени был стремный, с маком и сиквенсом. Чтобы на одной ноде, сука, все были похожи, как сестры в-очёвски, а ты такой ищешь где там разница в 25 разряде. Дико бесило всегда, и лень проверять, стало ли лучше.
DypHuu_niBEHb # 0 ⇈
похоже на мой BCD
Совсем разные UUID
softpawww # 0 ⇈
bormand # 0 ⇈
MAPTbIwKA # 0
никак не могу привыкнуть к тому, что
и
это две большие разницы.
Причем начиная с +11 петух может быть некопируемым, но двигаемым (как юник) и тогда первый вариант вообще не скомпилируется.
bormand # 0 ⇈
А в третьих, NRVO конпеляторы применяли давным-давно, так что на практике первый вариант был не особо то и хуже.
guest # 0 ⇈
А почему он может мувнуть p? Потому что это последняя строчка, и оно больше не нужно?
>NRVO конпеляторы
да, эта оптимизация была, но компилятор не обязан же был..
Вот если у меня не копируемый тип и с++03, то я вообще не могу так писать, хотя как-бы в теории он может и RVO
bormand # 0 ⇈
Именно так. В остальных строчках ты пишешь std::move() вручную, чтобы случайно не спиздить значение. А в момент return'а уже всем пофиг.
> Не обязан
Ну да. Но, тем не менее, многие на это надеялись. Иначе вместо возврата придётся юзать явное void foo(Petuh &out), а это некрасиво.
> не копируемый тип
Это да. Почти все оптимизации так работают. Сначала проверяется, что при стандартной семантике всё ок. А потом уже код выбрасывается. Более того, твой второй вариант тоже не работает если нечем копировать и/или мувать, проверь.
guest # 0 ⇈
А вот так точно не скококо
придется
да?
Мув же получает по ссылке, и возвращает по rvalue ref?
bormand # 0 ⇈
Да, всё так, невнимательно прочитал код.
guest # 0 ⇈
ну так вот он точно отсосет, да?
bormand # 0 ⇈
guest # 0 ⇈
отож)) а я уже побежал проверять
bormand # 0 ⇈
guest # 0 ⇈
А еще мне нравится что недвижимость и некопируемость влияет на дефолтные конструкторы.
Если в структуре есть хоть одно некопируемое поле, то дефолтный констнруктор копирования удаляется.
bormand # 0 ⇈
Да не, я просто хуйню пишу не думая. Мувалка у Bar и так сгенерится.
return Bar{std::move(foo)}; в общем.
guest # 0 ⇈
А как питузы жили до 11? Возвращали через указатель?
Клиент выделял память, но не инициализировал ее?
Нельзяж там в RAII?
Тогда два раза звали котруктор? Или на куче?
bormand # 0 ⇈
На самом деле, писать на крестах до с++11 - тлен и безысходность.
glandovyshibatel # 0 ⇈
guest # 0 ⇈
В некотором смысле это цена за RAII.
В сишечке передать структуру по указателю чтобы ее заполнили довольно распостранено, но там же не обязательно ее инициализировать
bormand # 0 ⇈
Но это уже не RAII, да. Resource acquisition и initialization оказываются разбиты, надо не забывать что у объекта появилось невалидное состояние.
guest # 0 ⇈
А вот у шапреев можно так (см ключ слово out):
Конструктор вызовется ОДИН раз, а структ будет в стеке Main'а.
Охуеть, правда?
Почему нельзя так в крестах?
bormand # 0 ⇈
guest # 0 ⇈
bormand # 0 ⇈
Да он сам обычно норм пилится если ты какой-то хуйни в поля не натащил или у тебя не десятая вижуал студия.
И зануление во всяких указателях да контейнерах уже есть. Его только в самых листовых классах надо делать.
guest # 0 ⇈
Тогда там и мува не было, тогда вообще можно было соснуть. А в С# уже тогда можно было все;)
out был еще 15 лет назад вроде
>И зануление во всяких указателях да контейнерах уже есть.
Ну если это умный поинтер, то да.
А если это моя обертка вокруг внешних ресурсов, то брать MFC нужно быть оккуратным
bormand # 0 ⇈
А х.з., бага какая-то была, почему-то не умела дефолтный мув генерить если её явно не пнуть.
bormand # 0 ⇈
То при её написании надо быть аккуратным, да. А дальше уже пользоваться ей можно без проблем.
guest # 0 ⇈
А когда все это сделано -- кресты уже дальше сами все сделают правильно
Desktop # 0 ⇈
bormand # 0 ⇈
1) Либо там происходит вызов мув конструкторов, который обычно передаёт немножко указателей из старого объекта в новый, а в старом зануляет.
2) Либо там срабатывает RVO/NRVO и всё работает как с out ссылкой в шарпе.
Desktop # 0 ⇈
не происходит ли там внутри дополнительного копирования
guest # 0 ⇈
нет, зачем?
Desktop # 0 ⇈
guest # 0 ⇈
Довольно просто все
Причем если обратиться к неинициализированной или забыть ее заполнить -- не скомпилируется
В С++ нету такой вот семантики "аут переменных" (или я про нее не знаю: я еще слишком анскилен, чтобы авторитетно что-то заявлять про кресты)
glandovyshibatel # 0 ⇈
Под твоим капотом происходят сочные камерунские хуи.
MAPTbIwKA # 0 ⇈
6arPoBblu_nemyx # 0 ⇈
Sers # 0 ⇈
Desktop # 0 ⇈
типа в первом варианте может быть какой-то побочный эффект?
bormand # 0 ⇈