C++ MPFRC++ 如何将 memcpy() 与 mpfr::mpreal 一起使用?
C++ MPFRC++ How to use memcpy() with mpfr::mpreal?
我找不到与此问题相关的任何内容。假设我在堆中有两个 mpfr::mpreal
数组,a
和 b
,如 new mpfr::mpreal[n]
。由于调用和使用数组的函数,我必须使用 C 风格的数组。我无法修改它,我试过了,但它给出了错误的结果,而且会崩溃,对于我的关卡来说,这是一个相当大且复杂的函数。如果数组可以变大(大小和 type/precision),我想避免复制循环,我想改用 memcpy()
。我应该使用什么作为第三个参数?
我试过 sizeof(mpfr::mpreal)
但它总是给出 32
,无论我在 mpfr_set_default_prec()
中使用什么。在首页我看到可以用mpfr::machine_epsilon()
来更好的显示这个,但是在memcpy()
怎么用呢?
mpfr::mpreal
变量(或它们的数组)是 C++ 对象,memcpy
无法正确复制它。使用 std::copy 或循环代替。
memcpy
只是逐位复制内存块,这对于简单的 POD C 风格数据结构来说效果很好。 C++ 对象应通过调用赋值运算符进行复制,以便对象可以自行处理内存分配等。
mpfr::mpreal
的大小始终相同,因为它只包含指向尾数的指针,尾数分配在不同内存位置的堆中。 memcpy
只复制指针,它不会重新分配尾数,因此源和目标 mpreals 将指向内存中的相同尾数。这正是应该避免的。反过来,std::copy
很好地处理了这个问题——通过使用 mpreal class 的赋值运算符复制循环中的每个对象(它进行必要的重新分配等)
(我是 MPFR C++ 的作者)。
我找不到与此问题相关的任何内容。假设我在堆中有两个 mpfr::mpreal
数组,a
和 b
,如 new mpfr::mpreal[n]
。由于调用和使用数组的函数,我必须使用 C 风格的数组。我无法修改它,我试过了,但它给出了错误的结果,而且会崩溃,对于我的关卡来说,这是一个相当大且复杂的函数。如果数组可以变大(大小和 type/precision),我想避免复制循环,我想改用 memcpy()
。我应该使用什么作为第三个参数?
我试过 sizeof(mpfr::mpreal)
但它总是给出 32
,无论我在 mpfr_set_default_prec()
中使用什么。在首页我看到可以用mpfr::machine_epsilon()
来更好的显示这个,但是在memcpy()
怎么用呢?
mpfr::mpreal
变量(或它们的数组)是 C++ 对象,memcpy
无法正确复制它。使用 std::copy 或循环代替。
memcpy
只是逐位复制内存块,这对于简单的 POD C 风格数据结构来说效果很好。 C++ 对象应通过调用赋值运算符进行复制,以便对象可以自行处理内存分配等。
mpfr::mpreal
的大小始终相同,因为它只包含指向尾数的指针,尾数分配在不同内存位置的堆中。 memcpy
只复制指针,它不会重新分配尾数,因此源和目标 mpreals 将指向内存中的相同尾数。这正是应该避免的。反过来,std::copy
很好地处理了这个问题——通过使用 mpreal class 的赋值运算符复制循环中的每个对象(它进行必要的重新分配等)
(我是 MPFR C++ 的作者)。