реклама на сайте
подробности

 
 
> Структуры данных
inventor
сообщение Jan 18 2018, 10:02
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748



Подскажите мне вот такую вещь
я хочу реализовать какой то хранитель или тип для данных разного размера
пример: по COM порту приходит пачка данных размером от
10 до 1000 байт.
я хочу положить их в свою структуру данных
данные разного размера
в какой то другом потоке я их забираю по указателю
если это что то типа связного списка или очередеи
то я вижу что там данные одного размера
чета я не понимаю, как мне сделать
чтобы хранить разный размер.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
sigmaN
сообщение Jan 20 2018, 17:57
Сообщение #2


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Ну имеется ввиду, что существуют разные архитектуры процессоров. С разными требованиями по выравниванию данных. И даже с разным расположением байт в многобайтовых интах.
Таким образом описанная абсолютно одинаково на языке Си структура будет представлена в памяти совершенно по-разному!
Если обе системы и для приёма и для передачи будут применять простое копирование этого региона памяти в линию передачи данных то при неудачном стечении обстоятельств вы прините совсем не то что вам отправляли.

Например STM8 big endian - вообще редкость, скажем так.
На AVR требований по выравниванию нет и все поля структуры лягут в память по порядку без дыр.
На STM32 же между uint8 и uint32 в структуре будет padding т.е. дыра.

Всё это не важно пока и приёмник и передатчик работают на одном процессоре(точнее с одинаковым порядком байт и требованиями по выравниванию).

Кажется в этой статье можно найти что-то полезное на эту тему.
https://thatskriptkid.wordpress.com/2015/01...80%D1%83%D0%BA/

И вот что-то нашел
https://habrahabr.ru/company/xakep/blog/258959/


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
ArtemKAD
сообщение Jan 20 2018, 21:12
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 508
Регистрация: 26-06-06
Из: Киев
Пользователь №: 18 364



Цитата(sigmaN @ Jan 20 2018, 19:57) *
Ну имеется ввиду, что существуют разные архитектуры процессоров. С разными требованиями по выравниванию данных. И даже с разным расположением байт в многобайтовых интах.
Таким образом описанная абсолютно одинаково на языке Си структура будет представлена в памяти совершенно по-разному!
Если обе системы и для приёма и для передачи будут применять простое копирование этого региона памяти в линию передачи данных то при неудачном стечении обстоятельств вы прините совсем не то что вам отправляли.

Например STM8 big endian - вообще редкость, скажем так.
На AVR требований по выравниванию нет и все поля структуры лягут в память по порядку без дыр.
На STM32 же между uint8 и uint32 в структуре будет padding т.е. дыра.

#pragma pack(1)

или __packed для описания структуры
вполне спасет от возможных дырок и будет гораздо проще чем заниматься сериализацией.

Цитата(sigmaN @ Jan 20 2018, 19:57) *
И вот что-то нашел
https://habrahabr.ru/company/xakep/blog/258959/

По-моему в этом "что-то" как раз написано почему сериализацию лучше не делать.

По-моему весьма однозначно:
Цитата
WARNING

Если дорожишь эффективностью при передаче данных, то отдавай предпочтение бинарным протоколам (если, конечно, у тебя есть выбор).
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 17:12
Рейтинг@Mail.ru


Страница сгенерированна за 0.01387 секунд с 7
ELECTRONIX ©2004-2016