- 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
- 30
#include <iostream>
#include <string>
using namespace std;
struct A
{
uint16_t n;
uint8_t a1:1;
uint8_t a2:1;
uint8_t a3:1;
uint8_t a4:1;
uint8_t a5:4;
uint8_t b;
} __attribute__((packed));
int main()
{
char v[] = { 0x1, 0x1, 0b01010011, 0x9 };
A *p = (A*)v;
cout << (uint16_t)p->a1 << endl;
cout << (uint16_t)p->a2 << endl;
cout << (uint16_t)p->a3 << endl;
cout << (uint16_t)p->a4 << endl;
cout << (uint16_t)p->a5 << endl;
cout << (uint16_t)p->b << endl;
}
rotoeb 12.10.2020 19:02 # −20
YpaHeLI_ 12.10.2020 19:16 # 0
rotoeb 12.10.2020 19:17 # −20
gost 12.10.2020 19:35 # −1
rotoeb 12.10.2020 19:36 # −20
Хотя, половина бита - это нечто невозможное.
gost 12.10.2020 20:16 # +2
К сожалению, пролетающий воздушный шар Пётр Иванович не заметил. С неохотой оторвавшись от окна он оделся, проверил плиту, взял ключи и вышел за дверь. Проезжающий по мокрому асфальту серебряный «Hyundai Solaris» не справился с управлением и не успел затормозить. Петра Ивановича не стало.
Вот это и есть примерно половина бита.
bormand 12.10.2020 19:37 # +1
От половины бита и сишник взвоет. Хотя и такое бывает, конечно.
Rabindranath_Tagore 12.10.2020 20:35 # 0
Вот у нас есть «половина бита» b1 (в памяти она занимает целый бит — будем считать это выравниванием) и «половинка бита» b2, а в программе везде используется только (b1 xor b2) или (b1 == b2). Тогда, зная только b1 или только b2, мы не сможем предугадать поведение программы, а зная значения обоих, будем знать результат.
Fike 12.10.2020 20:37 # +1
при bitwise-операциях может стать отсутствием одного бита
bormand 12.10.2020 20:39 # 0
gost 12.10.2020 20:41 # +2
Упихал два значения — 1 и 0 — в один бит, проверь.
guest6 14.09.2024 22:31 # 0
YpaHeLI_ 12.10.2020 20:28 # −19
Хз зачем я это сделал
bormand 12.10.2020 20:29 # 0
Ну вот и на сишке так сделай и всё будет норм. Только сдвиг ещё добавить надо, если значение А5 интересно.
YpaHeLI_ 12.10.2020 20:32 # −1
Чисто чтобы потом людям удобнее читать было, если нужно станет, видимо.
Я уж не совсем новичок, лет 6-7 уже опыт на крестах.
gost 12.10.2020 20:34 # 0
Ну если их не сериализовывать (или сериализовывать только в рамках одного приложения на одной машине) — действительно лучше же.
bormand 12.10.2020 20:43 # −1
Если тебе пофиг на их внутреннее представление - да, они довольно удобны.
Но тебе же не пофиг, раз ты полез байты разглядывать. Видимо пытаешься совместимость с чем-то запинать. В этом случае я бы не стал юзать битовые поля.
Хотя подогнать порядок можно, конечно. И в пределах одного ABI он не уплывёт. Конпеляторы, соблюдающие одно ABI, всё-таки стараются чтобы сишные интерфейсы между ними не ломались.
guest8 12.10.2020 22:10 # −999
bormand 12.10.2020 22:22 # −1
digitalEugene 13.10.2020 05:00 # 0
bormand 12.10.2020 19:07 # 0
YpaHeLI_ 12.10.2020 19:14 # 0
1
1
0
0
5
9
bormand 12.10.2020 19:14 # 0
YpaHeLI_ 12.10.2020 19:15 # 0
Видимо багрепорт придется писать.
bormand 12.10.2020 19:16 # +1
Allocation of bit-fields within a class object is implementation-defined. Alignment of bit-fields is implementation-defined.
Удачного багрепорта.
З.Ы. Именно поэтому я никогда не юзаю битфилды.
YpaHeLI_ 12.10.2020 19:19 # 0
bormand 12.10.2020 19:21 # 0
defecate-plusplus 12.10.2020 19:30 # +2
при этом чтобы на высоком уровне оставался доступ через foo.a = 100;
rotoeb 12.10.2020 19:35 # −22
defecate-plusplus 12.10.2020 20:39 # 0
YpaHeLI_ 12.10.2020 19:46 # −1
Значит он будет в конце байта.
bormand 12.10.2020 19:47 # −1
YpaHeLI_ 12.10.2020 19:55 # −1
bormand 12.10.2020 20:00 # −1
Ну и x86 всё-таки little-endian, младшим байтом вперёд.
YpaHeLI_ 12.10.2020 20:07 # −1
rotoeb 12.10.2020 20:09 # −19
Rabindranath_Tagore 12.10.2020 20:31 # 0
bormand 12.10.2020 20:34 # 0
Порядок битов - это скорее о каком-нибудь последовательном порту, в который мы биты один за другим срём. А с точки зрения проца порядка битов обычно и нет. Он их все одновременно выгружает.
Rabindranath_Tagore 12.10.2020 20:43 # −1
• Одни компиляторы пушат в стек переменные по очереди, так что последняя переменная находится ниже всех.
• Другие компиляторы сразу выделяют память в стеке (sub rsp, константа) и размещают переменные в порядке их объявления, так что последняя переменная оказывается выше всех.
И вроде оба способа имеют право на существование, потому что из хорошего кода есть доступ только к переменным по отдельности, по их имени, а доступа к локальным переменным как к массиву нет.
Значит, и тут в хорошем коде должен быть доступ только к битовым полям по отдельности, по их имени, чтобы не думать о порядке упаковки?
bormand 12.10.2020 20:55 # 0
Rabindranath_Tagore 12.10.2020 21:09 # −1
Значит, для сериализации нужно собирать байты ручками?
bormand 12.10.2020 21:11 # −1
guest8 12.10.2020 21:59 # −999
Rabindranath_Tagore 12.10.2020 22:10 # −1
guest8 12.10.2020 22:13 # −999
Rabindranath_Tagore 12.10.2020 22:26 # 0
Проверил несколько реализаций «Паскаля» — дискриминант (поле, указывающее на то, какой из вариантов активен) проверяет только «Irie Pascal» (который сейчас никому не нужен, потому что он поддерживает только «Standard Pascal» без расширений).
defecate-plusplus 12.10.2020 22:29 # +2
Rabindranath_Tagore 12.10.2020 22:30 # +1
guest8 12.10.2020 22:31 # −999
Rabindranath_Tagore 12.10.2020 19:47 # −1
Приведите реальные примеры инструкций x86, у которых есть доступ к битам по номеру.
bormand 12.10.2020 19:48 # 0
gost 12.10.2020 19:29 # −1
Где здесь хуйня, YpaHeLI_?
Берём 0b01010011, наименее значащий бит — первое битовое поле, следующий за наименее значащим — второе, потом третье, и так далее, и тому подобное. a5 получается простым сдвигом вправо на 4 бита.
rotoeb 12.10.2020 19:34 # −20
digitalEugene 13.10.2020 05:21 # 0
rotoeb 13.10.2020 09:17 # 0
digitalEugene 13.10.2020 09:23 # 0
guest8 13.10.2020 12:19 # −999
bootcamp_dropout 13.10.2020 12:27 # −1
guest8 13.10.2020 12:39 # −999
defecate-plusplus 13.10.2020 13:22 # −1
guest8 13.10.2020 14:00 # −999
defecate-plusplus 13.10.2020 14:06 # 0
ну это, походу, вот такой вариант
4 ноды по 2 цпу (= 8 цпу) и 24 слота памяти на ноду (=96 слотов)
если заебенить 256ГБ модули, как раз 24ТБ и выйдет
а зионы 28 ядерные (8*28*2), чтобы получить 448 vcpu
CHayT 13.10.2020 14:08 # 0
defecate-plusplus 13.10.2020 14:09 # −1
DypHuu_niBEHb 13.10.2020 19:35 # 0
Выходит, DRAM контроллер управляет не чипами, а управляет он буфером, который эмулирует для него этакий виртуальный "ранк".
Получается, что контроллер может поддержать куда больше памяти, но наверныяка за счет некоторой латентности буфера.
Впрочем, там наверное такие кеши, что это и не важно.
bormand 13.10.2020 14:19 # 0
rotoeb 13.10.2020 13:57 # 0