Boost から出力するcpp_int
と、オブジェクト全体がコピーされたように見えます。
#include <iostream>
#include <boost/multiprecision/cpp_int.hpp>
using std::cout;
void* operator new(size_t size) {
void *memory = malloc(size);
cout << "New: " << memory << " " << size << "\n";
return memory;
}
int main() {
auto u = new boost::multiprecision::cpp_int("987654321");
cout << "------\n";
cout << *u << "\n";
}
New: 0x23d4e70 32
------
New: 0x23d52b0 31
987654321
紛らわしいのは、印刷のオーバーロードが であるということですが、などの関数にostream& operator<<(ostream&, const T&)
渡しても、新しいメモリ割り当ては表示されません。私も試しましたが、これも2番目のメモリ割り当てを引き起こします。*u
template <typename T> void cr(const T&) {}
u->str()
私はまた、のcoutをオーバーロードしようとしましたcpp_int
:
std::ostream& operator <<(std::ostream& stream, const boost::multiprecision::cpp_int& mpi) {
return stream << mpi.str();
}
しかし、結果は同じでした。ただし、既にオーバーロードがあると予想していたので、これがコンパイルされたことにも驚いています。私の推測では、バックエンドをさらに変更する必要があるかもしれません。
どうすればこれを回避できますか? を印刷するたびに 30 バイト以上をコピーしてから削除したくありませんcpp_int
。
そうでない場合は、インターフェイスが最小限のリファクタリングで類似している限り、データ型を切り替えることは問題外ではありません。