1

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番目のメモリ割り当てを引き起こします。*utemplate <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

そうでない場合は、インターフェイスが最小限のリファクタリングで類似している限り、データ型を切り替えることは問題外ではありません。

4

1 に答える 1