Нашли или выдавили из себя код, который нельзя назвать нормальным,
на который без улыбки не взглянешь?
Не торопитесь его удалять или рефакторить, — запостите его на
говнокод.ру, посмеёмся вместе!
Переведи на "PHP". Здесь никто не обязан знать язык для "Arduino" и прочих игрушек для школьников, увлекающихся робототехникой, нанотехнологиями и мечтающих попасть в "Сколково" (на котором верхи, к слову, просто пилят деньги и ржут над сиволапым деревенским синим быдлом, отдающим детей в "крутые" кружки и классы).
Мне надо просто принять от клиента данные и сохранить их в базе данных; либо, напротив, выдать ему некую информацию. Нахуй мне какие-то битовые поля? В чём их прикол?
Ну вот смотри: у Васи Пупкина есть тысяча воздушных шариков, из которых 707 — красные, а 293 — зелёные. Пётр Иванович Штольников — престарелый профессор философских наук — страдает лёгкой степенью протанопии. Опаздывая на встречу выпускников, Вася Пупкин не глядя схватил десяток шариков и выбежал на улицу. Однако в это же время совершенно случайно в городе была сильная буря, и девять из десяти шаров Васи унесло непогодой в соседний город. Примерно через три часа один из унесённых ветром шаров пролетел мимо окна Петра Ивановича Штольникова, который в этот момент любовался красивым закатом. К сожалению, из-за глазной болезни заслуженного профессора пролетающий воздушный шарик остался незамеченным Петром Ивановичем. Возможно, сложись всё иначе, и Пётр Иванович вспомнил бы, как, стоя на линейке с красивой лентой через плечо, он вместе со своей одноклассницей Людей — теперь уже, конечно, Людмилой Сергеевной — запускал в небо точно такие же воздушные шарики. Вспомнил бы — и позвонил своей старой знакомой, которая всю жизнь страшно любила поболтать. Проболтав (хотя, откровенно говоря, прослушав) с ней до темноты, Пётр Иванович раздосадованно стукнул бы себя по лбу — в магазин идти уже поздно. Поворчав для приличия, профессор щёлкнул бы выключателем ночника и спокойно заснул.
К сожалению, пролетающий воздушный шар Пётр Иванович не заметил. С неохотой оторвавшись от окна он оделся, проверил плиту, взял ключи и вышел за дверь. Проезжающий по мокрому асфальту серебряный «Hyundai Solaris» не справился с управлением и не успел затормозить. Петра Ивановича не стало.
У меня есть идея: половина бита — это такое значение, которое не имеет смысла без его второй половинки.
Вот у нас есть «половина бита» b1 (в памяти она занимает целый бит — будем считать это выравниванием) и «половинка бита» b2, а в программе везде используется только (b1 xor b2) или (b1 == b2). Тогда, зная только b1 или только b2, мы не сможем предугадать поведение программы, а зная значения обоих, будем знать результат.
Ну да, примерно так это и работает во всяком энтропийном кодировании. По значению b1 мы всегда можем предсказать значение b2. Т.е. мы упихали 2 значения в один бит. И можно сказать, что каждое из них занимает по половине.
Да я так всегда и делал, тимлид сказал лучше битовые поля юзать.
Чисто чтобы потом людям удобнее читать было, если нужно станет, видимо.
Я уж не совсем новичок, лет 6-7 уже опыт на крестах.
> тимлид сказал лучше битовые поля юзать
Ну если их не сериализовывать (или сериализовывать только в рамках одного приложения на одной машине) — действительно лучше же.
Если тебе пофиг на их внутреннее представление - да, они довольно удобны.
Но тебе же не пофиг, раз ты полез байты разглядывать. Видимо пытаешься совместимость с чем-то запинать. В этом случае я бы не стал юзать битовые поля.
Хотя подогнать порядок можно, конечно. И в пределах одного ABI он не уплывёт. Конпеляторы, соблюдающие одно ABI, всё-таки стараются чтобы сишные интерфейсы между ними не ломались.
именно эта поебень заставила меня много лет тому назад делать на шаблонах битовые поля в структуре, чтобы не зависело от компилятора и, главное, бесплатно проходило через границу слова внутри структуры
при этом чтобы на высоком уровне оставался доступ через foo.a = 100;
кстати, я помню, из-за того, что проффессия прогграммиста была типа илитарной, а должность крестуха уж тем более, а контора нанимала 1 крестоблядь в столетие, я после собесов на домашнее задание именно эту задачу и давал лол
Не порядок битов, а порядок упаковки битовых полей в структуру.
Порядок битов - это скорее о каком-нибудь последовательном порту, в который мы биты один за другим срём. А с точки зрения проца порядка битов обычно и нет. Он их все одновременно выгружает.
Я вспомнил, как компиляторы хранят локальные переменные функции (если на них брать указатели, чтобы он не смог их оптимизировать в регистр):
• Одни компиляторы пушат в стек переменные по очереди, так что последняя переменная находится ниже всех.
• Другие компиляторы сразу выделяют память в стеке (sub rsp, константа) и размещают переменные в порядке их объявления, так что последняя переменная оказывается выше всех.
И вроде оба способа имеют право на существование, потому что из хорошего кода есть доступ только к переменным по отдельности, по их имени, а доступа к локальным переменным как к массиву нет.
Значит, и тут в хорошем коде должен быть доступ только к битовым полям по отдельности, по их имени, чтобы не думать о порядке упаковки?
Да не, в пределах одного ABI можно аккуратно запинать битовые поля. Самому битовые и байтовые паддинги расставить, типы правильно подобрать и т.п. Но стоит ли оно того?
А я вспомнил про юнионы.
Там вроде гарантируется, что у тебя работает только один член. Так что ты можешь пыжиться, и понимать внутренее устройство юниона, но стандарту на твое понимание пофиг.
Кто-то (чуть ли не Калиграфер?) говорил, что отличие нуба от настоящего крестовика в том, что нуб начинает рассуждать как конкретная фича реализована, и делает из этого выводы, что можно, а что нельзя.
В «Турбо Паскале» отказались от проверки дескриптора вариантных полей записи, чтобы они работали, как union в сишке (в популярных на тот момент реализациях сишки, а не в стандарте). Всё правильно сделали?
Ну да. Поэтому записи с вариантными полями в наследниках «Турбо Паскаля» («Delphi», «Free Pascal») часто используют в качестве reinterpret cast.
Проверил несколько реализаций «Паскаля» — дискриминант (поле, указывающее на то, какой из вариантов активен) проверяет только «Irie Pascal» (который сейчас никому не нужен, потому что он поддерживает только «Standard Pascal» без расширений).
Берём 0b01010011, наименее значащий бит — первое битовое поле, следующий за наименее значащим — второе, потом третье, и так далее, и тому подобное. a5 получается простым сдвигом вправо на 4 бита.
Какого хуя ты приперся в ветку C++ и начал здесь доказывать что C++ это хуйня ебанная для собак и говноедов? Иди дальше оптимизировать хранение строчки в мускуле называя это достижением века
Но ведь действительно: оптимизация - это путь нищебродов, неспособных арендовать сервер подороже и вынужденных тщательно продумывать длину поля в БД, отказывающих себе в "mediumtext" и "bigint", тяжело вымучивающих каждый индекс, и так далее.
rotoeb # 0
YpaHeLI_ # 0 ⇈
rotoeb # 0 ⇈
gost # 0 ⇈
rotoeb # 0 ⇈
Хотя, половина бита - это нечто невозможное.
gost # 0 ⇈
К сожалению, пролетающий воздушный шар Пётр Иванович не заметил. С неохотой оторвавшись от окна он оделся, проверил плиту, взял ключи и вышел за дверь. Проезжающий по мокрому асфальту серебряный «Hyundai Solaris» не справился с управлением и не успел затормозить. Петра Ивановича не стало.
Вот это и есть примерно половина бита.
bormand # 0 ⇈
От половины бита и сишник взвоет. Хотя и такое бывает, конечно.
Rabindranath_Tagore # 0 ⇈
Вот у нас есть «половина бита» b1 (в памяти она занимает целый бит — будем считать это выравниванием) и «половинка бита» b2, а в программе везде используется только (b1 xor b2) или (b1 == b2). Тогда, зная только b1 или только b2, мы не сможем предугадать поведение программы, а зная значения обоих, будем знать результат.
Fike # 0 ⇈
при bitwise-операциях может стать отсутствием одного бита
bormand # 0 ⇈
gost # 0 ⇈
Упихал два значения — 1 и 0 — в один бит, проверь.
YpaHeLI_ # 0 ⇈
Хз зачем я это сделал
bormand # 0 ⇈
Ну вот и на сишке так сделай и всё будет норм. Только сдвиг ещё добавить надо, если значение А5 интересно.
YpaHeLI_ # 0 ⇈
Чисто чтобы потом людям удобнее читать было, если нужно станет, видимо.
Я уж не совсем новичок, лет 6-7 уже опыт на крестах.
gost # 0 ⇈
Ну если их не сериализовывать (или сериализовывать только в рамках одного приложения на одной машине) — действительно лучше же.
bormand # 0 ⇈
Если тебе пофиг на их внутреннее представление - да, они довольно удобны.
Но тебе же не пофиг, раз ты полез байты разглядывать. Видимо пытаешься совместимость с чем-то запинать. В этом случае я бы не стал юзать битовые поля.
Хотя подогнать порядок можно, конечно. И в пределах одного ABI он не уплывёт. Конпеляторы, соблюдающие одно ABI, всё-таки стараются чтобы сишные интерфейсы между ними не ломались.
guest # 0 ⇈
Все всегда хуячат байт или двубайт, и делают потом оры и энды. Даже в старых джаваапишках такое видел
Чому?
bormand # 0 ⇈
digitalEugene # 0 ⇈
bormand # 0
YpaHeLI_ # 0 ⇈
1
1
0
0
5
9
bormand # 0 ⇈
YpaHeLI_ # 0
Видимо багрепорт придется писать.
bormand # 0 ⇈
Allocation of bit-fields within a class object is implementation-defined. Alignment of bit-fields is implementation-defined.
Удачного багрепорта.
З.Ы. Именно поэтому я никогда не юзаю битфилды.
YpaHeLI_ # 0 ⇈
bormand # 0 ⇈
defecate-plusplus # 0 ⇈
при этом чтобы на высоком уровне оставался доступ через foo.a = 100;
rotoeb # 0 ⇈
defecate-plusplus # 0 ⇈
YpaHeLI_ # 0 ⇈
Значит он будет в конце байта.
bormand # 0 ⇈
YpaHeLI_ # 0 ⇈
bormand # 0 ⇈
Ну и x86 всё-таки little-endian, младшим байтом вперёд.
YpaHeLI_ # 0 ⇈
rotoeb # 0 ⇈
Rabindranath_Tagore # 0 ⇈
bormand # 0 ⇈
Порядок битов - это скорее о каком-нибудь последовательном порту, в который мы биты один за другим срём. А с точки зрения проца порядка битов обычно и нет. Он их все одновременно выгружает.
Rabindranath_Tagore # 0 ⇈
• Одни компиляторы пушат в стек переменные по очереди, так что последняя переменная находится ниже всех.
• Другие компиляторы сразу выделяют память в стеке (sub rsp, константа) и размещают переменные в порядке их объявления, так что последняя переменная оказывается выше всех.
И вроде оба способа имеют право на существование, потому что из хорошего кода есть доступ только к переменным по отдельности, по их имени, а доступа к локальным переменным как к массиву нет.
Значит, и тут в хорошем коде должен быть доступ только к битовым полям по отдельности, по их имени, чтобы не думать о порядке упаковки?
bormand # 0 ⇈
Rabindranath_Tagore # 0 ⇈
Значит, для сериализации нужно собирать байты ручками?
bormand # 0 ⇈
guest # 0 ⇈
Там вроде гарантируется, что у тебя работает только один член. Так что ты можешь пыжиться, и понимать внутренее устройство юниона, но стандарту на твое понимание пофиг.
Кто-то (чуть ли не Калиграфер?) говорил, что отличие нуба от настоящего крестовика в том, что нуб начинает рассуждать как конкретная фича реализована, и делает из этого выводы, что можно, а что нельзя.
А настоящий крестовик сразу идет в стандарт
Rabindranath_Tagore # 0 ⇈
guest # 0 ⇈
Как-то не очень. Паскаль же строгим должен быть
Rabindranath_Tagore # 0 ⇈
Проверил несколько реализаций «Паскаля» — дискриминант (поле, указывающее на то, какой из вариантов активен) проверяет только «Irie Pascal» (который сейчас никому не нужен, потому что он поддерживает только «Standard Pascal» без расширений).
defecate-plusplus # 0 ⇈
Rabindranath_Tagore # 0 ⇈
guest # 0 ⇈
Rabindranath_Tagore # 0 ⇈
Приведите реальные примеры инструкций x86, у которых есть доступ к битам по номеру.
bormand # 0 ⇈
gost # 0 ⇈
Где здесь хуйня, YpaHeLI_?
Берём 0b01010011, наименее значащий бит — первое битовое поле, следующий за наименее значащим — второе, потом третье, и так далее, и тому подобное. a5 получается простым сдвигом вправо на 4 бита.
rotoeb # 0 ⇈
digitalEugene # 0 ⇈
rotoeb # 0 ⇈
digitalEugene # 0 ⇈
guest # 0 ⇈
bootcamp_dropout # 0 ⇈
guest # 0 ⇈
defecate-plusplus # 0 ⇈
guest # 0 ⇈
https://aws.amazon.com/ec2/instance-types/high-memory/
Так что Ротоёб может вообще ничего не оптимизировать.
Стоимость месячной аренды будет примерно равна зарплате Ротоёба за 10 лет, но это технические детали уже
зы: интересно, как физически выглядит столько памяти? Это NUMA и охулион процессоров?
defecate-plusplus # 0 ⇈
ну это, походу, вот такой вариант
4 ноды по 2 цпу (= 8 цпу) и 24 слота памяти на ноду (=96 слотов)
если заебенить 256ГБ модули, как раз 24ТБ и выйдет
а зионы 28 ядерные (8*28*2), чтобы получить 448 vcpu
CHayT # 0 ⇈
defecate-plusplus # 0 ⇈
DypHuu_niBEHb # 0 ⇈
Выходит, DRAM контроллер управляет не чипами, а управляет он буфером, который эмулирует для него этакий виртуальный "ранк".
Получается, что контроллер может поддержать куда больше памяти, но наверныяка за счет некоторой латентности буфера.
Впрочем, там наверное такие кеши, что это и не важно.
bormand # 0 ⇈
rotoeb # 0 ⇈