Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;MPFRC&x2B+;如何将memcpy()与mpfr::mpreal一起使用?_C++_Memcpy_Mpfr - Fatal编程技术网

C++ C++;MPFRC&x2B+;如何将memcpy()与mpfr::mpreal一起使用?

C++ C++;MPFRC&x2B+;如何将memcpy()与mpfr::mpreal一起使用?,c++,memcpy,mpfr,C++,Memcpy,Mpfr,我找不到任何与这个问题相关的东西。假设我在堆中有两个mpfr::mpreal数组,a和b,作为new mpfr::mpreal[n]。我必须使用C风格的数组,因为有一个函数调用并使用数组。我不能修改它,我试过了,但它给出了错误的结果,加上崩溃,这对于我的级别来说是一个相当大和复杂的函数。如果数组可能变大(大小和类型/精度),我希望避免复制循环,而是使用memcpy()。我应该使用什么作为第三个参数 我尝试了sizeof(mpfr::mpreal),但无论我在mpfr\u set\u defaul

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


我尝试了
sizeof(mpfr::mpreal)
,但无论我在
mpfr\u set\u default\u prec()中使用什么,它总是给出
32
。在主页中,我看到了我可以使用<代码> MPF::MexeEpEpSon()/Cuff>来更好地显示这个,但是我如何在代码> > MycPy]()中使用它?< /P> < P> <代码> MPR::MpAlal> /Cuff>变量(或它们的数组)是C++对象,它不能被<代码> MeMCPY正确复制。使用std::copy或loop代替

memcpy
只是一点一点地复制内存块,这对于简单的POD C风格的数据结构非常有效。C++对象应该通过调用赋值运算符来复制,这样对象可以自己处理内存分配等。
mpfr::mpreal
的大小始终相同,因为它只包含指向尾数的指针,尾数分配在不同内存位置的堆中。
memcpy
只复制指针,它不会重新分配尾数,因此源和目标mpreal将指向内存中相同的尾数。这正是应该避免的。反过来,
std::copy
很好地解决了这一问题——使用mpreal类的赋值操作符复制循环中的每个对象(它执行必要的重新分配等)


(我是MPFRC++的作者)。

< P> <代码> MPFR::MPRARA变量(或数组)是C++对象,不能正确地被<代码> MeMCPY复制。使用std::copy或loop代替

memcpy
只是一点一点地复制内存块,这对于简单的POD C风格的数据结构非常有效。C++对象应该通过调用赋值运算符来复制,这样对象可以自己处理内存分配等。
mpfr::mpreal
的大小始终相同,因为它只包含指向尾数的指针,尾数分配在不同内存位置的堆中。
memcpy
只复制指针,它不会重新分配尾数,因此源和目标mpreal将指向内存中相同的尾数。这正是应该避免的。反过来,
std::copy
很好地解决了这一问题——使用mpreal类的赋值操作符复制循环中的每个对象(它执行必要的重新分配等)


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

我想避免复制循环,我想改用memcpy()
。这不是一个好主意。mpfr使用大整数作为尾数,并且可能在堆中分配部分信息。这样的信息不打算在不同的
mpreal
-之间共享,以避免双重自由错误。我不知道它们是如何在幕后处理的,但这很有意义。
我希望避免复制循环,我希望改为使用memcpy()。这不是一个好主意。mpfr使用大整数作为尾数,并且可能在堆中分配部分信息。这些信息不打算在不同的
mpreal
-之间共享,以避免双重自由错误。我不知道如何在引擎盖下处理它们,但这很有意义。感谢您的解释。我问这个问题的原因是因为我最近看到一个页面,其中显示,对于数组复制而言,未优化的代码比
memcpy()
慢得多(我自己也做了一个快速验证)。经过优化,某些编译器的性能相似。总之,我将选择循环,因为它似乎是最直接的事情。我不特别喜欢
std::copy
或任何写在引擎盖下的东西,因为它们的通用性和(轻微的)开销会给特殊情况带来影响,比如我的情况。谢谢你的解释。我问这个问题的原因是因为我最近看到一个页面,其中显示,对于数组复制而言,未优化的代码比
memcpy()
慢得多(我自己也做了一个快速验证)。经过优化,某些编译器的性能相似。总之,我将选择循环,因为它似乎是最直接的事情。我不特别喜欢
std::copy
或任何写在引擎盖下的东西,因为它们的用途非常广泛,而且(轻微的)开销会给某些特殊情况带来,比如我的情况。