0

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

我试过sizeof(mpfr::mpreal)但它总是给32,不管我用什么mpfr_set_default_prec()。在主页中我已经看到我可以使用它mpfr::machine_epsilon()来更好地显示它,但是我该如何使用它memcpy()呢?

4

1 回答 1

2

变量(或它们的mpfr::mpreal数组)是 C++ 对象,它不能被memcpy正确复制。请改用 std::copy 或循环。

memcpy只是逐位复制内存块,这适用于简单的 POD C 风格的数据结构。应该通过调用赋值运算符来复制 C++ 对象,以便对象可以自己处理内存分配等。

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

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

于 2016-10-09T09:26:56.793 回答