-1

我有 2 个 C++ 类I1I2实现整数运算;每个都针对它可以处理的整数大小进行了优化,每个都采用特定的内存大小。

我想有一些封装的高级 Integer 类I1I2并且我可以在运行时配置(使用一些静态方法)以使其充当I1or I2。基本思想是根据她/他在运行时定义的所需算术精度,让客户使用 Integer 而不是I1or 。I2请注意,运行时考虑对我来说至关重要。

一个“自然”的选择是使用动态分配,但我有很多实例要处理(有很多临时对象)并且动态分配变得耗时。

我看了看boost::variant, I1I2它可以满足我的需要。但是,该变体似乎具有 size max(sizeof(I1),sizeof(I2)),这对我来说是个问题,因为我需要将实例转储到具有适当大小的文件系统中。

我的问题是这样的:有没有可能定义这样一个 Integer 类:

  • 在一些运行时配置之后使用I1或实现I2
  • 使用堆栈而不是堆(无动态分配)
  • 仅使用所需的内存(sizeof(I1)如果I1使用,sizeof(I2)如果I2使用),而不是两种大小中的最大值。
4

2 回答 2

0

我可能已经找到了一些适用于我的情况的重新设计选择。我的性能问题(内存问题和执行时间)主要是因为我想在整个代码中使用依赖于一个特定实现的通用整数类。换句话说,我试图在太低的级别上使用该变体。

实际上,我的整数类被具体化为模板类的算法使用Algo<T>,模板T是整数类I1I2.

我可以使用boost::variant两种类型Algo<I1>Algo<I2>

  • 从客户端来看,只看到了变体,所以代码是通用的(除了变体的初始化);例如,execute可以通过一些变体访问者调用算法的方法。
  • 内存使用是最佳的,因为在低级整数算术中没有使用变体
  • 出于同样的原因,时间执行是最佳的,因为我们不必遭受switch数十亿次底层(变体内部的硬编码)的影响。

我能看到的唯一不好的事情是需要定义几种变体类型;实际上,我不仅有,Algo<T>而且还有其他几种类型,具体取决于 template T。例如,我需要一些算法结果类型。这是我尝试在低级别仅使用一种变体的最初原因,但是我对性能的担忧使我改变了主意。

于 2013-10-07T17:10:21.947 回答
0

你可以使用boost::variant. 转储到文件系统时,您将其转换为包含的类型(i1i2)而不是变体并转储结果。这可以通过访问者来完成。

更新:经过edrezen的澄清(在下面的评论中)。

据我了解,您需要一个基于堆栈(因为要避免动态内存分配)的可区分联合容器(例如boost::variantInteger,它可以保存类型为I1或的值I2。此外,如果i是一个Integer,那么你想要

  1. sizeof(i) == sizeof(I1)如果i持有一个I1值;和
  2. sizeof(i) == sizeof(I2)ifi持有一个I2值。

这是不可能的,因为类型的大小是在编译时决定的,不能在运行时更改。

你能拥有的最好的就是boost::variant给予的东西,即sizeof(I) == max(sizeof(I1), sizeof(I2)). 您可能过于担心内存消耗和过早优化。我建议你去boost::variant

于 2013-10-03T17:31:55.200 回答