2016-10-09 13 views
0

이 질문과 관련된 항목을 찾을 수 없습니다. 두 개의 mpfr::mpreal 어레이 (ab)가 힙에 new mpfr::mpreal[n]으로 있다고 가정합니다. 배열을 호출하고 사용하는 함수 때문에 C 스타일 배열을 사용해야합니다. 나는 그것을 수정할 수 없다. 시도했지만, 잘못된 결과를 주었고, 충돌을 일으켰다. 그것은 내 수준에서 상당히 크고 복잡한 기능이다. 배열이 커질 수있는 경우 (크기 및 유형/정밀도 모두), 복사를위한 루프를 피하고 싶습니다. 대신 memcpy()을 사용하고 싶습니다. 제 3의 논쟁으로 무엇을 사용해야합니까?C++ MPFRC++ memfpy()를 mpfr :: mpreal과 함께 사용하는 방법?

시도해 보았지만 에 상관없이 항상 32을 제공합니다. 홈 페이지에서 이것을 더 잘 표시하기 위해 mpfr::machine_epsilon()을 사용할 수 있음을 알았지 만, 어떻게 이것을 memcpy()에서 사용할 수 있습니까?

+0

'나는 복사를 피하기 위해 memcpy()를 대신 사용하고 싶습니다. ' 좋은 생각이 아닙니다. mpfr은 가수에 큰 정수를 사용하며 힙에 정보의 일부를 할당 할 가능성이 큽니다. 이러한 정보는 두 개의 자유 오류를 피하기 위해 서로 다른 'mpreal'사이에서 공유되도록 의도되지 않았습니다. – Franck

+0

나는 그들이 어떻게 두포에서 다루어 졌는지는 몰랐다. 그러나 그것은 많은 의미를 가진다. –

답변

2

변수 (또는 배열)가 C++ 객체 인 경우 memcpy으로 올바르게 복사 할 수 없습니다. 대신 std :: copy 또는 loop를 사용하십시오.

memcpy은 메모리 블록을 비트 단위로 복사하기 때문에 간단한 POD C 스타일 데이터 구조에 적합합니다. C++ 객체는 객체가 메모리 할당 등을 스스로 취할 수 있도록 할당 연산자를 호출하여 복사해야합니다.

mpfr::mpreal의 크기는 다른 메모리 위치의 힙에 할당 된 가수 (mantissa)에 대한 포인터를 포함하므로 항상 동일합니다. memcpy은 포인터를 복사 만하고 가수를 재 할당하지 않으므로 원본 및 대상 mpreals는 메모리의 동일한 가수를 가리 킵니다. 이것은 피해야 만하는 것입니다. 마찬가지로 std::copy은 mpreal 클래스의 할당 연산자 (필요한 재 할당 등)를 사용하여 루프의 모든 객체를 복사함으로써

(나는 MPFR C++의 작성자 임)입니다.

+0

설명해 주셔서 감사합니다. 내가 물었던 이유는 매우 최근에, 최적화되지 않은 코드가 배열 복사에 대해'memcpy()'보다 훨씬 느리다는 것을 보았 기 때문이다. 최적화 된 성능은 특정 컴파일러에서 비슷했습니다. 결론적으로 루프를 선택하는 것이 가장 직접적인 방법입니다. 나는 특히'std :: copy' 또는 그들이 만든 일반적인 사용과 광산과 같은 특별한 경우를 가져 오는 (약간의) 오버 헤드로 인해 후드 아래에 쓰여진 것을별로 좋아하지 않습니다. –