GMP предоставляет методы для инициализации и назначения mpz_t.
Вызов mpz_init_set (a, b) назначит для содержимого b.Тем не менее, я предполагаю, что это выполняет глубокое копирование на b.
. В моем проекте мне нужно работать с массивами mpz_t, длина которых составляет 5 000 000 (речь идет о 640 МБ памяти), и каркас Im using выполняет различные операции присваивания таких типов (я не разрабатывал фреймворк и переписал его не как вариант).Недавно я понял, что после большинства назначений значение 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() { }
}