Страницы

Поиск по вопросам

среда, 12 декабря 2018 г.

Минимизация потребления памяти корректировкой типов

Работаю с проектом, реализующим кодирование информации. В коде имеются достаточно большие двумерные массивы. Вопрос в следующем: есть ли смысл минимизировать потребление памяти, прицельно используя специальные типы данных? Пример 1: int stateTable[64][6]; а там, в этой таблице, сплошь нули и единицы. Нужно ли приводить к виду uint8_t stateTable[64][6];? При этом придётся перелопачивать весь проект и править все типы во всех методах, где используется эта таблица. Пример 2: for(int i; i < N; ++i) - а по логике работы больше итератор не может быть больше 64. Нужно ли "забирать" у него лишнюю память? Стоят ли подобные ухищрения времени, или это незначащие мелочи?


Ответ

64*6*4 = 1536 - полтора килобайта. Я бы даже не переживал за такие размеры. Но если эту таблицу нужно постоянно копировать туда-сюда, а там на самом деле ноли и единицы, то может и упаковать ее (используя битовые операции)
При этом придётся перелопачивать весь проект и править все типы во всех методах, где используется эта таблица.
Для этого используют typedef. Заводят свой новый тип и его уже используют. Это позволит и посмотреть на реальное использование. Да и просто обычными ifdef можно будет легко переключать.
for(int i; i < N; ++i)
А вот здесь все куда интереснее. Вы можете конечно написать uint8_t (и не забыть инициализировать i, а то мало чего). Но вот только это не улучшит ситуацию. Компилятор скорее всего забросит i в регистр, где оно будет как минимум 32бита. А если использовать uint8_t, то компилятор может взять и начать делать касты (но может и не начать). Что бы не гадать, в stdint.h завезли специальные типы для этого случая. Вам наверно подойдет 'uint_fast8_t'. На моей машине внутри этот тип определен так
typedef unsigned char uint_fast8_t;
(я думал, там будет unsigned int).
Но вот использовать этот тип как элемент массива я уже бы не стал - обычно все алгоритмы кодирования информации очень трепетно к размерам относятся, а здесь может от компилятора к компилятору меняться.
Итого
Мое предложение - для всех "сомневающихся случаев" заведите свой тип, объявите его в одном глобальном хедере и просто используйте. Если что то поменяется - так будет проще.

Комментариев нет:

Отправить комментарий