2011-11-29 60 views
0

我正在计划创建一个数字类。目的是保存任意数量的数字,而不必担心会得到太多(如int或long)。但同时并不太多。例如:C++:可扩展的数字类 - bitset <1> *或unsigned char *

如果我只有真正需要1-10的数据,我不需要int(4字节),short(2字节)或甚至char(1字节)。那么为什么分配这么多? 如果我想要保存的数据需要非常大的数量(在这种情况下只有整数),像过去数十亿,我不能。 我的目标是创建一个数字类,可以像字符串一样处理这个问题,调整大小以适应数字。但在开始之前,我想知道..

bitset < 1>,bitset是一个模板类,它允许我在C++中缩小比特,非常有用,但效率高吗?,bitset < 1>会定义1比特,但是我想制作一系列它们吗? C++可以分配一个最小字节,bitset < 1>分配一个字节并提供该字节的1位?如果是这样的话,我宁愿用unsigned char *创建我的数字类。

unsigned char或BYTE保存8个字节,0到256之间的任何内容只需要一个,多个需要两个,然后是3,它将在需要时以字节间隔而不是位间隔继续扩展。

你认为哪种效率更高?如果bitset实际分配了1位,那么这些位就是这样,但我有一种感觉,即使它不可能。实际上,在32位处理器上,32位分配是最有效的,因此我会一次使用4个字节,直到4字节(32位)为止,实际上可以更有效地分配字节。

基本上我的问题是,你有什么想法?我应该如何去执行这个操作,bitset < 1>,或unsigned char(或BYTE)?

+2

您不能分配小于一个字符的内存。 –

+0

@OliCharlesworth是的你可以:'char x [0];' – Pubby

+0

@Pubby:干得好! –

回答

2

除非您的目标架构是DigiComp-1,否则优化位是愚蠢的。读取单个位总是比读取整数慢 - 4位不比8的效率更高。

如果要将其作为十进制数存储,请使用无符号字符。这将是最有效的。

或者,您可以使用GMP

+0

谢谢,我会看看GMP。 – u8sand

+0

可能有正确的理由来优化位;你可能有一个庞大的数据集,因此受到内存限制。 –

+0

是的,这是真的,但如果是这样的话,我会为那种独立使用位的情况做一个自定义类。 – u8sand

1

bitset模板需要一个编译时const整数作为它的模板参数。当您必须在运行时确定最大位数时,这可能是一个缺点。另一件事是大多数编译器/库使用unsigned intunsigned long long来存储这些位以便更快地访问内存。如果您的应用程序在内存有限的环境中运行,则应该创建一个类似bitset的新类或使用其他库。

1

虽然不会直接帮助您在巨型的数字运算,如果这种节省空间的是,那么你可能会发现我的NSTATE图书馆有用(升压许可证)你的目标:

http://hostilefork.com/nstate/

例如:如果你有一个值可以在0到2之间......那么只要你将这些数组存储在一个数组中,你就可以利用未使用的第四状态的“浪费”空间(3 )打包更多的价值。在这种特殊情况下,您可以在32位字中获得20个三态,而不是每个三态2位获得的16个。

+0

这很酷,我会检查一下。谢谢! – u8sand