Мелкая копия mpz_t - PullRequest
       20

Мелкая копия mpz_t

5 голосов
/ 24 февраля 2012

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() { }
}
...