GMP は、mpz_t を初期化して割り当てるためのメソッドを提供します。
mpz_init_set(a, b) を呼び出すと、b の内容が a に割り当てられます。ただし、これはbでディープコピーを実行すると思います。
私のプロジェクトでは、5,000,000 (640MB のメモリについて話している) の mpz_t の配列を操作する必要があり、使用しているフレームワークはそのような型に対してさまざまな割り当て操作を実行します (私はフレームワークを開発して書き直していません)。オプションではありません)。最近、ほとんどの代入後に 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() { }
}