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

 
 
 
Reply to this topicStart new topic
> Вопрос по структуре.
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
gosha-z
сообщение Jan 19 2017, 07:28
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 327
Регистрация: 30-10-05
Пользователь №: 10 288



А теперь то же самое со структурой
Код
struct blablabla {
    uint8_t a;
    uint16_t b;
};
Go to the top of the page
 
+Quote Post
jorikdima
сообщение Jan 19 2017, 07:28
Сообщение #3


тут может быть ваша реклама
*****

Группа: Свой
Сообщений: 1 164
Регистрация: 15-03-06
Из: Санкт-Петербург/CA
Пользователь №: 15 280



Что не так?
Почитайте про структуры. Полно же материалов в сети.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 19 2017, 07:31
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (Jenya7 @ Jan 19 2017, 09:19) *
n = 4. Без #pragma pack.
Кто кого обманывает?
А сколько надо?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
k155la3
сообщение Jan 19 2017, 07:50
Сообщение #5


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

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



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


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

Группа: Свой
Сообщений: 1 080
Регистрация: 16-11-04
Из: СПб
Пользователь №: 1 143



Цитата(Jenya7 @ Jan 19 2017, 10:19) *
Кто кого обманывает?



вот даже курсы на халяву есть.


--------------------
Марс - единственная планета, полностью населенная роботами (около 7 штук).
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jan 19 2017, 07:58
Сообщение #7


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

Группа: Участник
Сообщений: 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
Kabdim
сообщение Jan 19 2017, 08:30
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842



Всем же известно что если значения инт помещаются в диапазон -128 ... 127 то boxing/unboxing будет соптимизирован. :] Как там написано объект lnteger может занимать до 12 байт. Занимательная ява
А если серьезно, то http://bfy.tw/9Z3Y .
sm.gif
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jan 19 2017, 09:03
Сообщение #9


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

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



Цитата(Kabdim @ Jan 19 2017, 14:30) *
Всем же известно что если значения инт помещаются в диапазон -128 ... 127 то boxing/unboxing будет соптимизирован. :] Как там написано объект lnteger может занимать до 12 байт. Занимательная ява
А если серьезно, то http://bfy.tw/9Z3Y .
sm.gif

а кто сказал что перед ldrb не будет произведен boxing/unboxing?

а...понял - Zero extend to 32 bits on loads.
то еть можно спать спокойно?

Сообщение отредактировал Jenya7 - Jan 19 2017, 09:05
Go to the top of the page
 
+Quote Post
esaulenka
сообщение Jan 19 2017, 09:04
Сообщение #10


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

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



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

Действительно, как же компайлер (Herz! где же Herz?! :-) ) будет их выполнять?.. Он же компайлер языка си, слова боксинг не разумеет...

What is Boxing and Unboxing?
Conversion of a primitive type to the corresponding reference type is called boxing, such as an int to a java.lang.Integer. Conversion of the reference type to the corresponding primitive type is called unboxing, such as Byte to byte. Since JDK 1.5, Conversion from primitive types to corresponding wrapper objects and vice versa can happen automatically.


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
k155la3
сообщение Jan 19 2017, 10:45
Сообщение #11


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

Группа: Свой
Сообщений: 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
Сообщение #12


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

Группа: Участник
Сообщений: 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 Текстовая версия Сейчас: 18th July 2025 - 20:12
Рейтинг@Mail.ru


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