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

 
 
> Вопрос по структуре.
Jenya7
сообщение Jan 19 2017, 07:19
Сообщение #1


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

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Сделал такую проверку.
Код
typedef struct MY_STRUCT_S
{
  uint8_t b1;
  uint8_t b2;
  uint8_t b3;
  uint8_t b4;
}MY_STRUCT;

MY_STRUCT struct1;

uint32_t n = sizeof(struct1);

n = 4. Без #pragma pack.
Кто кого обманывает?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
k155la3
сообщение Jan 19 2017, 07:50
Сообщение #2


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

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



А вообще, зачем Вам надо знать размер структуры,
и, насколько я предполагаю, с точностью до байта,
да еще и в контексте #pragma pack(x) ?
Вам жалко компилятор, и Вы хотите ему помогать ? sm.gif
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jan 19 2017, 07:58
Сообщение #3


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

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(k155la3 @ Jan 19 2017, 13:50) *
А вообще, зачем Вам надо знать размер структуры,
и, насколько я предполагаю, с точностью до байта,
да еще и в контексте #pragma pack(x) ?
Вам жалко компилятор, и Вы хотите ему помогать ? sm.gif

до сих пор я все поля делал uint32_t хотя у меня есть члены структуры для которых uint8_t достаточно. у меня есть довольно большая структура и есть массив этой структуы который отжирает много места в RAM. если я перейду с uint32_t на uint8_t я сэкономлю много места. но тогда компайлер будет выполнять операции boxing/unboxing?
Go to the top of the page
 
+Quote Post
k155la3
сообщение Jan 19 2017, 10:45
Сообщение #4


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

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Цитата(Jenya7 @ Jan 19 2017, 11:58) *
до сих пор я все поля делал uint32_t хотя у меня есть члены структуры для которых uint8_t достаточно. у меня есть довольно большая структура и есть массив этой структуы который отжирает много места в RAM. если я перейду с uint32_t на uint8_t я сэкономлю много места. но тогда компайлер будет выполнять операции boxing/unboxing?

Я решаю аналогичную задачу (запись архива событий, записи различных форматов и различной длины).
Чтобы не делать запись всегда из максимально-используемой длины,
используя "замес" из структур типов-форматов-ABC в структуре, объединенных union { char[30] или str_A или str_B или str_C или . . . . )
ABC определены как типы.

Как вариант, можно ваш супер-массив преобразовать в массив указателей на массивы структур, или их элементы,
каждый из которых будет содержаться в "своем", оптимизированном под нее по размеру.


Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jan 19 2017, 11:07
Сообщение #5


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

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(k155la3 @ Jan 19 2017, 15:45) *
Я решаю аналогичную задачу (запись архива событий, записи различных форматов и различной длины).
Чтобы не делать запись всегда из максимально-используемой длины,
используя "замес" из структур типов-форматов-ABC в структуре, объединенных union { char[30] или str_A или str_B или str_C или . . . . )
ABC определены как типы.

Как вариант, можно ваш супер-массив преобразовать в массив указателей на массивы структур, или их элементы,
каждый из которых будет содержаться в "своем", оптимизированном под нее по размеру.

да я просто заменю uint32_t на uint8_t. в любом случае влияние на скорость исполнения будет небольшое по сравнению с сэкономленым местом в RAM.
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 31st July 2025 - 06:32
Рейтинг@Mail.ru


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