|
|
  |
Экономия RAM. |
|
|
|
Mar 8 2016, 13:55
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE (Jenya7 @ Mar 8 2016, 15:40)  и все таки? To byte or not to byte? 1 байт или 4 байта? Если указать паковать структуру побайтно типа #pragma pack( push, 1 ) .... #pragma pack( pop ) , то тогда ГАРАНТИРОВАННО 1 бай. Если НЕ указать, то на усмотрение компилятора. QUOTE (Jenya7 @ Mar 8 2016, 15:47)  просто не хочу пользоваться динамическим выделением памяти Тогда не жалуйтесь. QUOTE хранить переменные во флеше - медленный доступ. Переменные во Flash не храняться в принципе  QUOTE паковать структуры - тоже удар по быстродействию. Не больший, чем использовать без допиливания по месту всяких LwIP запимающих по 29K.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Mar 8 2016, 14:01
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(zltigo @ Mar 8 2016, 16:47)  Смысл прост - если для контролера естественной единицей являются 32 бита, то любые другие размертности приходится преобразовывать, что уже неестественно. Поскольку у конкретного 32bit команда могут быть навороченными - типа взять и сдвинуть за одну команду, то это может уже оказаться при размещении в структуре "беслатно" и в игру вступает оптимизация. Мы, кажется, обсуждали вполне конкретную платформу, не испытывающую трудностей при доступе к переменным с малой разрядностью, так что эти утверждения - Цитата(zltigo @ Mar 8 2016, 15:34)  Вообще-то 4 байта на этой платформе. Если не паковать в структуры. ... Всегда по 4, если так или иначе не указывать компилятороу индивидуальные правила паковки, но и в этом случае структура без паковки будет кратна 4 байтам. - не соответствуют действительности. Цитата(zltigo @ Mar 8 2016, 16:47)  Но по любому, если нужен ГАРАНТИРОВАННЫЙ результат, то только указания компилятору правил паковки, ну а для достижения лучшей оптимизации, это да - все элементы структуры стараться располагать в ней опять-же по границам слов. Ваш второй пример этому условию соответствует. С этим никто не спорит, но специально добавлять padding там, где в нем ни малейшей нужды нет, компилятор не станет. Цитата(Jenya7 @ Mar 8 2016, 16:47)  просто не хочу пользоваться динамическим выделением памяти. Напрасно не хотите.
|
|
|
|
|
Mar 8 2016, 14:08
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE (aaarrr @ Mar 8 2016, 16:01)  Мы, кажется, обсуждали вполне конкретную платформу, не испытывающую трудностей при доступе к переменным с малой разрядностью, так что эти утверждения - - не соответствуют действительности. Трудности таки ЕСТЬ, иначе и в первом Вашем примере все было-бы однобайтовым. Во втором "хорошем" примере Ваш конкретный компилятор просто смог соптимизировать.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Mar 8 2016, 14:23
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(zltigo @ Mar 8 2016, 17:08)  Трудности таки ЕСТЬ, иначе и в первом Вашем примере все было-бы однобайтовым. Это другого рода трудности, возникающие как раз при доступе к "естественной" 32-битной переменной, а не гипотетические трудности, возникающие при доступе к переменной с разрядностью менее естественной, и отсутствующие для данной платформы. Цитата(zltigo @ Mar 8 2016, 17:08)  Во втором "хорошем" примере Ваш конкретный компилятор просто смог соптимизировать. Так сделает любой вменяемый компилятор.
|
|
|
|
|
Mar 8 2016, 14:31
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(aaarrr @ Mar 8 2016, 15:20)  Зависит от окружения: Код struct { uint8_t v1; uint32_t v2; } В этом случае v1 займет 4 байта. Неужели? v1 = 256; v2 = v1; Сколько будет в v2? Я думаю 0.
|
|
|
|
|
Mar 8 2016, 14:48
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Есть версия, что v1 займет 1 байт (sizeof(v1) = 1), но после v1 будет размещено 3 неиспользуемых байта. sizeof для такой структуры будет равен 8.
Нужно ли обсуждать такой момент в доступе к невыровненным данным, как сборка многобайтового числа побайтово? Как известно CM3 может обращаться к невыровненным данным за счет штрафных тактов без генерации исключения. А, например, CM0 не допускает обращения к невыровненным данным с генерацией исключения. В этом случае собирать 32-битное невыровненное число нужно по байтам. А это лишние такты и память в случае CM3.
Можно ли компилятору принудительно разрешить или запретить сборку побайтово? Видимо, ответ: RTFM на компилятор.
Второй момент (все наоборот). Есть память с 32/16-битным доступом (например, батареечная память в STM32). Можно ли в ней разместить структуру элементов с меньшим размером, но чтоб доступ был 32/16-битным? Как это указать компилятору и можно ли сделать в принципе?
|
|
|
|
|
Mar 8 2016, 15:39
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(zombi @ Mar 8 2016, 21:16)  Даже прочитать всё это сложно! не говоря уже о том что бы понять! Пипец какой!!! Для программиста на ассемблере это всё просто дико! Чем люди занимаются вместо алгоритма  как говорил Форест Гамп - алгоритм алгоритму рознь. товарищи а вы как поступаете? как выделяете глобальные переменные и члены глобальных структур?
|
|
|
|
|
Mar 8 2016, 16:07
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE (Jenya7 @ Mar 8 2016, 17:39)  как выделяете глобальные переменные и члены глобальных структур? Какая разница КАК? Как не выделяй, если они НУЖНЫ, то они нужны. В Вашем случае, если хоть как то попытаться понять написанное, одна из проблем растраты памяти, это ее выделение оптом под всякие структуры, хоть используемые, хоть нет. На такие действия ответ один - НЕ выделяйте. А Вы какого ожидали? Если общие советы, то тут уже тоже перечислены: http://electronix.ru/forum/index.php?showt...t&p=1409464QUOTE (adnega @ Mar 8 2016, 16:48)  Можно ли в ней разместить структуру элементов с меньшим размером, но чтоб доступ был 32/16-битным? Как это указать компилятору и можно ли сделать в принципе? Играться с паковкой и ручным добавлением padding. QUOTE (zombi @ Mar 8 2016, 17:16)  Чем люди занимаются вместо алгоритма  Очевидно, что рукопашной возней с битами и байтами в низкоуровневых языках.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Mar 8 2016, 16:16
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(zltigo @ Mar 8 2016, 22:07)  Какая разница КАК? Как не выделяй, если они НУЖНЫ, то они нужны. В Вашем случае, если хоть как то попытаться понять написанное, одна из проблем растраты памяти, это ее выделение оптом под всякие структуры, хоть используемые, хоть нет. На такие действия ответ один - НЕ выделяйте. А Вы какого ожидали? Если общие советы, то тут уже тоже перечислены: http://electronix.ru/forum/index.php?showt...t&p=1409464Играться с паковкой и ручным добавлением padding. Очевидно, что рукопашной возней с битами и байтами в низкоуровневых языках. ну что значит - как не выделяй. можно создать переменную uint8_t а можно uint32_t. Перенести структуры в юнионы. - я не понял как это возможно. Использовать драйвера интерфейсов не одновременно, а с разделением во времени. - то же непонятно. (мне). я создаю массив структур с запасом не потому что я дурак (хотя это тоже) а потому что я не знаю сколько элементов понадобиться пользователю. представьте адресную книжку - появился новый друг - открыл новую запись.
Сообщение отредактировал Jenya7 - Mar 8 2016, 16:18
|
|
|
|
|
Mar 8 2016, 16:31
|

Гуру
     
Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106

|
Цитата(zltigo @ Mar 8 2016, 19:07)  Очевидно, что рукопашной возней с битами и байтами в низкоуровневых языках. В низкоуровневых языках я как раз этой фигнёй и не занимаюсь. Выделил память под переменную, знаю какой она размерности и знаю как к ней обращаться. В отличие от СИшников ! Которые думают-гадают как там за них компилятор всё порешает и поразмещает  куда и как повыравнивает  Цитата(Jenya7 @ Mar 8 2016, 19:16)  я создаю массив структур с запасом не потому что я дурак (хотя это тоже) а потому что я не знаю сколько элементов понадобиться пользователю. представьте адресную книжку - появился новый друг - открыл новую запись. Нет, так нельзя. Представьте себе сто появился миллиардный пользователь и открыл новую запись а размер этой записи несколько гигабайт. Вы предусматриваете такую возможность?
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|