GMP提供了初始化和赋值mpz_t的方法。调用mpz_init_set(a, b)将会将b的内容赋值给a。然而,我认为这会对b执行深层复制。
在我的项目中,我需要处理长度为5,000,000的mpz_t数组(约占用640MB内存),而我使用的框架对这些类型执行各种赋值操作(我没有开发该框架,重写它也不是一个选项)。最近,我意识到在大多数赋值之后,b的值被清除了,因此深度复制一个已经可以像本来那样使用的值似乎不自然。然而,框架的接口不允许这样做(使用mpz_t的包装器),而且改变这一点需要很多工作(我仍然可以改变一些基本事情)。
我已经尝试过基于指向mpz_class的指针的解决方案,但出乎意料的是这并没有提高性能。实际上,它减慢了执行速度(虽然没有在巨大的数组上进行测试)。
我的问题是:我可以浅复制mpz_t吗?以下是示例。
在我的项目中,我需要处理长度为5,000,000的mpz_t数组(约占用640MB内存),而我使用的框架对这些类型执行各种赋值操作(我没有开发该框架,重写它也不是一个选项)。最近,我意识到在大多数赋值之后,b的值被清除了,因此深度复制一个已经可以像本来那样使用的值似乎不自然。然而,框架的接口不允许这样做(使用mpz_t的包装器),而且改变这一点需要很多工作(我仍然可以改变一些基本事情)。
我已经尝试过基于指向mpz_class的指针的解决方案,但出乎意料的是这并没有提高性能。实际上,它减慢了执行速度(虽然没有在巨大的数组上进行测试)。
我的问题是:我可以浅复制mpz_t吗?以下是示例。
class somewrapper
{
mpz_t v;
somewrapper(mpz_t x) //constructor: probably performing deep copy here as well
{
// the following line performs a deep copy(?) on x
// but x is not used. why not shallow copy it?
mpz_init_set(v, x);
}
somefunction() { }
}