C ++ MPFRC ++如何使用mpfr :: mpreal的memcpy()?

时间:2016-10-09 09:04:35

标签: c++ memcpy mpfr

我找不到与此问题相关的任何内容。假设我在堆中有两个mpfr::mpreal数组ab,为new mpfr::mpreal[n]。由于调用和使用数组的函数,我必须使用C风格的数组。我无法修改它,我试过,但它给出了错误的结果,加上崩溃,这对我的关卡来说是一个相当大而复杂的功能。如果数组可以变大(大小和类型/精度),我想避免复制循环,我想使用memcpy()代替。我应该使用什么作为第三个参数?

我尝试sizeof(mpfr::mpreal),但无论我在32中使用什么,它总是会mpfr_set_default_prec()。在主页中,我看到我可以使用mpfr::machine_epsilon()来更好地显示此内容,但如何在memcpy()中使用它?

1 个答案:

答案 0 :(得分:2)

mpfr::mpreal变量(或它们的数组)是C ++对象,memcpy无法正确复制它。改为使用std :: copy或loop。

memcpy只是逐位复制内存块,这对于简单的POD C样式数据结构很有效。应该通过调用赋值运算符来复制C ++对象,以便对象可以单独获取内存分配等。

mpfr::mpreal的大小始终相同,因为它只包含指向尾数的指针,尾数在不同内存位置的堆中分配。 memcpy仅复制指针,它不会重新分配尾数,因此源和目标mpreals将指向内存中的相同尾数。这正是应该避免的。反过来,std::copy可以很好地处理这个问题 - 通过使用mpreal类的赋值运算符(执行必要的重新分配等)复制循环中的每个对象。

(我是MPFR C ++的作者)。