我有 2 个C++类I1
、I2
,实现整数算法;每个类都针对它可以处理的整数大小进行了优化,每个类都采用特定的内存大小。
我想要一些高级 Integer 类来封装 I1
、I2
并且可以在运行时配置(使用一些静态方法(以使其充当I1
或I2
。其基本思想是让客户端使用整数而不是I1
或I2
,根据她/他在运行时定义的所需的算术精度。请注意,运行时考虑对我来说至关重要。
一个"自然"的选择是使用动态分配,但我有很多实例要处理(有很多临时对象(,动态分配变得耗时昂贵。
我用I1
、I2
看了一下boost::variant
,它可以满足我的需求。但是,似乎该变体的大小max(sizeof(I1),sizeof(I2))
,这对我来说是一个问题,因为我需要以适当的大小转储文件系统中的实例。
我的问题是:是否有可能定义这样的整数类:
- 在某些运行时配置后使用
I1
或I2
实现 - 使用堆栈而不是堆(无动态分配(
- 仅使用所需的内存(如果使用
I1
sizeof(I1)
,sizeof(I2)
是否使用I2
(,而不是两种大小中的最大值。
您可以使用boost::variant
.转储到文件系统时,将其转换为包含的类型(i1
或i2
(并转储结果,而不是变体。这可以通过访客来完成。
更新:在edrezen澄清之后(在下面的评论中(。
据我了解,您想要一个基于堆栈的(因为要避免动态内存分配(可区分的联合容器(如boost::variant
(,称为Integer
,可以保存 I1
或 I2
类型的值。此外,如果i
是Integer
,那么你想要
-
sizeof(i) == sizeof(I1)
i
是否具有I1
值;以及 -
sizeof(i) == sizeof(I2)
i
是否具有I2
值。
这是不可能的,因为类型的大小是在编译时决定的,不能在运行时更改。
你能拥有的最好的是boost::variant
给予的,即sizeof(I) == max(sizeof(I1), sizeof(I2))
.您可能过于担心内存消耗和过早优化。我建议你去boost::variant
.
我可能已经找到了一些可以在我的情况下工作的重新设计选择。我的性能问题(内存问题和执行时间(主要是因为我想在整个代码中使用依赖于一个特定实现的泛型整数类。换句话说,我试图在太低的级别使用该变体。
实际上,我的整数类被算法化为模板类Algo<T>
,模板T
是整数类I1
或I2
。
我可以将boost::variant
与两种类型一起使用Algo<I1>
和Algo<I2>
:
- 从客户端的角度来看,只看到变体,所以代码是泛型的(变体的初始化除外(;例如,算法的
execute
方法可以通过某个变体访问者调用。 - 内存使用是最佳的,因为在低级整数算术中没有使用变体
- 出于同样的原因,时间执行是最佳的,因为我们不必遭受数十亿次底层
switch
(变体内部硬编码(的影响。
我能看到的唯一不好的事情是需要定义几种变体类型; 实际上,我不仅有Algo<T>
,而且还有几种其他类型,具体取决于模板T
。例如,我需要一些算法结果类型。这就是为什么我试图在低级别上只有一个变体的最初原因,但我对性能的担忧让我改变了主意。