C ++: масштабируемый класс чисел - bitset <1> * или беззнаковый символ * - PullRequest
0 голосов
/ 29 ноября 2011

Я планирую создать класс чисел. Цель состоит в том, чтобы хранить любое количество чисел, не беспокоясь о том, чтобы получить слишком много (например, с помощью int или long). Но в то же время не слишком много ИСПОЛЬЗОВАНИЯ. Например:

Если у меня есть данные, которые действительно нуждаются в 1-10, мне не нужны int (4 байта), short (2 байта) или даже char (1 байт). Так зачем выделять так много? Если я хочу хранить данные, которые требуют чрезвычайно большого объема (только целые числа в этом сценарии), например, за миллиарды, я не могу. Моя цель - создать числовой класс, который может справиться с этой проблемой, как это делают строки, подгоняя размер под число. Но прежде чем начать, мне было интересно ..

bitset <1>, bitset - это шаблонный класс, который позволяет мне минимизировать биты в C ++, весьма полезно, но эффективно ли это ?, bitset <1> определит 1 бит, но я хочу сделать их массив ? C ++ может выделить минимум байтов, выделяет ли bitset <1> байт и предоставляет ли 1 бит этого байта? в таком случае я бы предпочел создать свой класс чисел с беззнаковыми символами *.

unsigned char, или BYTE содержит 8 байтов, для любого значения от 0 до 256 потребуется только один, для большего потребуется два, а затем 3, он будет просто расширяться при необходимости в байтовых интервалах, а не в битовых интервалах.

Как вы думаете, БОЛЬШЕ эффективнее? Биты были бы, если бы битрейт фактически выделил 1 бит, но у меня есть ощущение, что это даже невозможно. На самом деле, может быть более эффективно выделять в байтах до тех пор, пока 4 байта (32 бита) на 32-битном процессоре 32-битное выделение не будет наиболее эффективным, поэтому я буду использовать 4 байта за раз с тех пор.

По сути, мой вопрос: что вы думаете? как я должен идти об этой реализации, bitset <1> или беззнаковый символ (или BYTE) ??

Ответы [ 3 ]

2 голосов
/ 29 ноября 2011

Глупо оптимизировать биты, если вы не являетесь целевой архитектурой DigiComp-1.Чтение отдельных битов всегда медленнее, чем чтение целых чисел - 4 бита не эффективнее, чем 8.

Используйте символ без знака, если вы хотите сохранить его как десятичное число.Это будет наиболее эффективным.

Или, вы можете просто использовать GMP .

1 голос
/ 29 ноября 2011

Хотя это не поможет вам напрямую с арифметикой гигантских чисел, но если вы хотите сэкономить место, то вам может пригодиться моя библиотека Nstate (дополнительная лицензия):

http://hostilefork.com/nstate/

Например: если у вас есть значение, которое может быть между 0 и 2 ... тогда, пока вы собираетесь хранить кучу их в массиве, вы можете использовать «потраченное впустую» пространство длянеиспользованное 4-е состояние (3), чтобы упаковать больше значений.В этом конкретном случае вы можете получить 20 тристатов в 32-битном слове вместо 16, которые вы получили бы с 2 битами на три состояния.

1 голос
/ 29 ноября 2011

Для шаблона битового набора требуется аргумент const во время компиляции для аргумента шаблона.Это может быть недостатком, когда необходимо определить максимальный размер битов во время выполнения.Другое дело, что большинство компиляторов / библиотек используют unsigned int или unsigned long long для хранения битов для более быстрого доступа к памяти.Если ваше приложение будет работать в среде с ограниченной памятью, вы должны создать новый класс, такой как bitset, или использовать другую библиотеку.

...