Size: a a a

2020 June 08

IZ

Ilia Zviagin in pro.cxx
Alex
Какой угодно это какой?
Есть, предположим, структура:
{
Uint8 q:3;
Uint8 b:3;
Uint8 r:2;
}
Указано выше выравнивание
по 1 байту через прагму.
Получается, у нас может быть такое, что мужу q и b будет пустое место и общий размер не 1 байт или порядок изменится или что?
Какой угодно .
источник

IZ

Ilia Zviagin in pro.cxx
Alex
К чему я это задаю. У нас много где используется обработка принятых пакетов через memcpy. В мингв все работает отлично, а если кто то возьмет и соберёт qt на msvc, то стоит ли ожидать косяков с этой стороны?
Это очень плохо.
источник

IZ

Ilia Zviagin in pro.cxx
Alex
К чему я это задаю. У нас много где используется обработка принятых пакетов через memcpy. В мингв все работает отлично, а если кто то возьмет и соберёт qt на msvc, то стоит ли ожидать косяков с этой стороны?
Только поясни что такое "обработка принятых пакетов через мемцпи", детально, а то может ты что-то другое имеешь в виду
источник

IZ

Ilia Zviagin in pro.cxx
Alex
Какой угодно это какой?
Есть, предположим, структура:
{
Uint8 q:3;
Uint8 b:3;
Uint8 r:2;
}
Указано выше выравнивание
по 1 байту через прагму.
Получается, у нас может быть такое, что мужу q и b будет пустое место и общий размер не 1 байт или порядок изменится или что?
Выравнивание как к битовыми полям относиться? Расскажи!
источник

A

Alex in pro.cxx
Ilia Zviagin
Только поясни что такое "обработка принятых пакетов через мемцпи", детально, а то может ты что-то другое имеешь в виду
Приходит пакет, данные хранятся в буфере  char data[n]. Есть структура с битовыми полями типа, типа
 struct s{
uint8_t a:2;
uint8_t b:6;
}
При обработке пакета:
memcpy(&S, data, sizeof(S)) ;
источник

A

Alex in pro.cxx
Ilia Zviagin
Выравнивание как к битовыми полям относиться? Расскажи!
Если не делать выравнивание, то, если параметры структуры не int, а меньше, выравнивается до размера int. Соответственно 2 чара будет занимать не 16 бит
источник

IZ

Ilia Zviagin in pro.cxx
Alex
Приходит пакет, данные хранятся в буфере  char data[n]. Есть структура с битовыми полями типа, типа
 struct s{
uint8_t a:2;
uint8_t b:6;
}
При обработке пакета:
memcpy(&S, data, sizeof(S)) ;
Очень плохо. Это по сути только на одном компиляторе будет работать.
источник

IZ

Ilia Zviagin in pro.cxx
Alex
Если не делать выравнивание, то, если параметры структуры не int, а меньше, выравнивается до размера int. Соответственно 2 чара будет занимать не 16 бит
Нет, ты неправ. Выравнивание тут ни при чём совсем.
источник

IZ

Ilia Zviagin in pro.cxx
Alex
Приходит пакет, данные хранятся в буфере  char data[n]. Есть структура с битовыми полями типа, типа
 struct s{
uint8_t a:2;
uint8_t b:6;
}
При обработке пакета:
memcpy(&S, data, sizeof(S)) ;
Тут надо писать явные функции сериализации и десериализации.
Это две простые функции, почему тебе так сложно  их написать? Я не понимаю.
(не только тебе, кстати)
источник

A

Alex in pro.cxx
Ilia Zviagin
Тут надо писать явные функции сериализации и десериализации.
Это две простые функции, почему тебе так сложно  их написать? Я не понимаю.
(не только тебе, кстати)
По своему опыту скажу : во-первых, многие приходят из си и там так делать нормально, по крайней мере у нас. И молодые, как я в свое время, учатся у старших и повторяют.
Во-вторых, об этом не всем известно, поэтому если у тебя обрабатываются десятки и более пакетов, проще делать так, чем на каждый писать сериализацию
источник

VO

Vyacheslav Olkhovche... in pro.cxx
Igor Akhmetov
Я думаю Илья имеет ввиду что разные компиляторы по-разному пакуют одинаковые битфилды, это точная инфа.
Да ладно? Всю жизнь там вся разница была в ендианес
источник

IZ

Ilia Zviagin in pro.cxx
Alex
По своему опыту скажу : во-первых, многие приходят из си и там так делать нормально, по крайней мере у нас. И молодые, как я в свое время, учатся у старших и повторяют.
Во-вторых, об этом не всем известно, поэтому если у тебя обрабатываются десятки и более пакетов, проще делать так, чем на каждый писать сериализацию
Нет, И ТАМ так делать НЕНОРМАЛЬНО!
источник

VO

Vyacheslav Olkhovche... in pro.cxx
Ilia Zviagin
То есть даже она не по разному, она вообще не определена, как делается
Определена в си
источник

IZ

Ilia Zviagin in pro.cxx
Alex
По своему опыту скажу : во-первых, многие приходят из си и там так делать нормально, по крайней мере у нас. И молодые, как я в свое время, учатся у старших и повторяют.
Во-вторых, об этом не всем известно, поэтому если у тебя обрабатываются десятки и более пакетов, проще делать так, чем на каждый писать сериализацию
Ну ок ок...
источник

IZ

Ilia Zviagin in pro.cxx
Vyacheslav Olkhovchenkov
Определена в си
Ну да, но она определена так, что конкретная расклада по байтикам НЕ определена.
источник

VO

Vyacheslav Olkhovche... in pro.cxx
Определена
источник

VO

Vyacheslav Olkhovche... in pro.cxx
Стандарт определяет порядок паковки битовых полей, ендианес платформы уже полностью определяет как это будет выглядеть в памяти
источник

Г

Генерал in pro.cxx
Кто писал хттп сервер на сокетах у вас все хорошо работало?А то у меня сервер не всегда отвечает на запросы(или вообще не видит их)
источник

VO

Vyacheslav Olkhovche... in pro.cxx
файлы .h для сетевых протоколов пестрят битовыми полями, ифдеф там только для ендианеса и все работает уже почти 50 лет на разных компиляторах
источник

IA

Igor Akhmetov in pro.cxx
Vyacheslav Olkhovchenkov
Стандарт определяет порядок паковки битовых полей, ендианес платформы уже полностью определяет как это будет выглядеть в памяти
Стандарт почти ничего не определяет про паковку битовых полей, она implementation defined. Выше дал пример, неужели сложно посмотреть?
источник