2016-10-09 11 views
0

この質問に関連するものは見つかりませんでした。ヒープ内に2つのmpfr::mpreal配列abがあり、new mpfr::mpreal[n]とします。配列を呼び出して使用する関数のためにCスタイルの配列を使用する必要があります。私はそれを変更することはできません、私は試しましたが、それは間違った結果をもたらし、さらにクラッシュする、私のレベルのためにかなり大きくて複雑な機能です。配列が大きくなる(サイズと型/精度の両方)場合は、コピーするループを避けたいので、代わりにmemcpy()を使いたいと思います。私は第3引数として何を使用すべきですか?C++ MPFRC++ mpfr :: mprealでmemcpy()を使用するには?

私はsizeof(mpfr::mpreal)を試みたが、それは常に関係なく、私がmpfr_set_default_prec()に使用するもの、32を与えません。ホームページでは、これをより良く表示するためにmpfr::machine_epsilon()を使用できることがわかりましたが、どうすればmemcpy()で使用できますか?

+0

'私はコピーのためのループを避けたいと思いますし、代わりにmemcpy()を使いたいです。それは良い考えではありません。 mpfrは、仮数に大きな整数を使用し、ヒープ内の情報の一部を割り当てる可能性があります。そのような情報は、異なるフリーランエラーを避けるために、異なる 'mpreal'の間で共有されることを意図していません。 – Franck

+0

私はそれらがどのようにフードの下で処理されたのか分からなかったが、それは多くの意味がある。 –

答えて

2

mpfr::mpreal変数(またはその配列)はC++オブジェクトです。memcpyで正しくコピーできません。代わりにstd :: copyまたはloopを使用してください。

memcpyはメモリブロックをビットごとにコピーするだけであり、単純なPOD Cスタイルのデータ構造では問題ありません。 C++オブジェクトは、オブジェクトがそれ自身でメモリ割り当てなどを取ることができるように代入演算子を呼び出すことによってコピーする必要があります。

mpfr::mprealのサイズは、異なるメモリ位置にヒープで割り当てられた仮数へのポインタを含んでいるだけなので、常に同じです。 memcpyはポインタだけをコピーしますが、仮数を再割り当てしないため、ソースとデスティネーションのmprealsはメモリ内の同じ仮数を指します。これはまさに避けなければならないことです。次に、std::copyは、mprealクラスの代入演算子(必要な再割り当てなど)を使用してループ内のすべてのオブジェクトをコピーすることによってこの問題を解決します。

(私はMPFR C++の著者です)

+0

ありがとうございます。私が尋ねた理由は、非常に最近では、最適化されていないコードが 'memcpy()'よりも配列コピーの方がずっと遅いことを示したページを見たからです。最適化されたパフォーマンスは、特定のコンパイラでも同様でした。全体として、ループを選択するのは、それが最も単純なことです。私は 'std :: copy'や、一般的な使用のためにフードの下に書かれたものや、私のような特別な場合に(わずかな)オーバーヘッドをもたらすものは特に気に入らない。 –

関連する問題