2016-10-09 7 views
0

Я не мог найти ничего, что связано с этим вопросом. Предположим, у меня есть два массива mpfr::mpreal, a и b, в куче, как new mpfr::mpreal[n]. Я должен использовать массивы C-стиля из-за функции, которая вызывает и использует массивы. Я не могу изменить его, я пытался, но он дает неправильные результаты, плюс сбои, это довольно большая и сложная функция для моего уровня. Если массивы могут стать большими (размер и тип/точность), я бы хотел избежать цикла для копирования, и вместо этого я бы использовал memcpy(). Что я должен использовать в качестве третьего аргумента?C++ MPFRC++ Как использовать memcpy() с mpfr :: mpreal?

Я пробовал sizeof(mpfr::mpreal), но он всегда дает 32, независимо от того, что я использую в mpfr_set_default_prec(). На домашней странице я видел, что могу использовать mpfr::machine_epsilon(), чтобы лучше показать это, но как я могу использовать его в memcpy()?

+0

'Я хотел бы избежать цикла для копирования, и я бы хотел использовать memcpy() вместо'. Это не очень хорошая идея. mpfr использует большие целые числа для мантиссы и, вероятно, выделяет часть информации в куче. Такая информация не предназначена для совместного использования между различными «mpreal» - для избежания двойных бесплатных ошибок. – Franck

+0

Я не знал, как они были обработаны под капотом, но это имеет большой смысл. –

ответ

2

Переменная (или массив из них) является объектом C++, ее нельзя скопировать по memcpy правильно. Вместо этого используйте std :: copy или loop.

memcpy просто копирует блоки памяти побитовые, что отлично работает для простых структур данных POD C-стиля. Объекты C++ должны быть скопированы вызовом оператора присваивания, чтобы объект мог принимать распределения памяти и т. Д. Сам по себе.

Размер mpfr::mpreal всегда тот же, поскольку он содержит указатель на мантисс, который выделяется в куче в различной памяти. memcpy копирует только указатель, он не перераспределяет мантиссу, и поэтому исходные и целевые mpreals будут указывать на ту же мантиссу в памяти. Именно этого следует избегать. В свою очередь, std::copy заботится об этой скважине - копируя каждый объект в цикле с использованием оператора присваивания класса mpreal (который делает необходимые перераспределения и т. Д.)

(Я являюсь автором MPFR C++).

+0

Благодарим вас за объяснение. Причина, по которой я спрашивал, состояла в том, что я недавно увидел страницу, на которой было показано, что неуправляемый код был намного медленнее для копирования массивов, чем 'memcpy()' (также быстро проверил себя). Оптимизированные, характеристики были схожими для некоторых компиляторов. В общем, я просто выберу цикл, поскольку это кажется самой простой задачей. Мне не особенно нравится 'std :: copy' или что-либо, написанное под капотом, из-за общего использования, за которое они были сделаны, и (незначительных) накладных расходов, которые приводят к конкретным случаям, таким как мой. –

 Смежные вопросы

  • Нет связанных вопросов^_^