Эффективное чтение / запись потоков битов в C

#c #libraries

#c #библиотеки

Вопрос:

Я пишу библиотеку сжатия данных, и мне нужно записать последовательность кодировок целых чисел (в различных целочисленных кодировщиках) в памяти, сохранить ее в файле, а затем прочитать их все позже.

Целочисленные кодировки должны храниться последовательно. Поскольку обычно их размер в битах не кратен 8, я не выравниваю их в памяти.

Короче говоря, мне нужно что-то, что предоставляет подобные функции:

 unsigned int BitReader::read_bits(size_t bits);
unsigned int BitWriter::write_bits(unsigned int num, size_t bits);
void BitWriter::get_array(char** array);
BitReader::BitReader(char *array);
  

Поскольку мне нужно вызывать эти функции в (очень) замкнутом цикле, эффективность представляет первостепенный интерес (особенно при чтении).

Знаете ли вы какие-нибудь библиотеки C , которые делают то, что я хочу? Спасибо.

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

1. Это эффективно? Кажется, что BitSet реализует другую абстракцию относительно того, что мне нужно (они реализуют set , мне нужен stream )

2. Вы не можете читать или записывать отдельные биты на диск, поэтому вашему Bitreader придется выполнять некоторую буферизацию.

3. @Bo Persson: это не проблема, я просто хочу что-то, что выполняет все операции в памяти и позволяет мне получить весь резервный массив, чтобы я мог записать его в память

4. Я бы попробовал это и посмотрел, хорошо ли это работает. Я не могу предположить, будет ли производительности набора битов достаточно для вашего варианта использования.

5. Вы не определили, какого рода «эффективность» вы ищете, но, похоже, вас беспокоит исходная производительность. В таком случае я говорю: остановитесь прямо здесь! Напишите свой код наиболее очевидным и поддерживаемым способом, определите его производительность, затем профилируйте и оптимизируйте те части, которые препятствуют достижению приемлемой производительности. (И я готов поспорить, что эти части никоим образом не будут связаны с проблемой, о которой вы здесь думаете.) Загуглите «преждевременная оптимизация» и будьте просвещены.

Ответ №1:

Если эффективность — ваше единственное требование, тогда получите адрес хранилища для данных и запишите его непосредственно в хранилище. Затем при восстановлении выделите то же хранилище и выполните обратную операцию. Это просто, быстро и не требует обучения.

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

1. Мне нужно эффективно последовательно считывать отдельные биты из потока битов в памяти, а не сохранять и считывать обратно весь материал.

Ответ №2:

Открытие потока для любого ввода / вывода является наиболее эффективным, хотя и не эффективным для огромного объема данных. Потоки предоставляют переносимый способ выполнения операций чтения / записи, поэтому вы можете открыть stream в памяти или на диске. Если вы хотите передать управление потоком на сам диск, я бы рекомендовал использовать функцию _bios_disk google «_bios_disk» для получения дополнительной информации.

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

1. Это не так. Я не могу вспомнить, почему я пометил это как «принято», но я больше не согласен с тем, что мои мысли были в тот момент 😉