#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. Это не так. Я не могу вспомнить, почему я пометил это как «принято», но я больше не согласен с тем, что мои мысли были в тот момент 😉