GMP 提供了初始化和分配 mpz_t 的方法。
调用 mpz_init_set(a, b) 会将 b 的内容分配给 a。但是,我认为这会对 b 执行深层复制。
在我的项目中,我需要使用长达 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() { }
}