作成した後でほとんど変更されていない多くの文字列があり、アクセス時間は本当に問題になりません。私はメモリの使用量を最小限に抑えなければならないので、標準に準拠するために容量や長さなどの余分なデータを保持しなければならないstd::string
を使用する代わりに、クラスを書くことにしました。この変更により、メモリ使用量は約%30減少しました。テンポラリの不要な割り当てを避ける、r値デストラクタ
これを達成するために、私はクラスを書くだけで、Cスタイルのヌルで終了する文字列を内部的にラップし、クラスがポインタデータメンバーで構成されるようにバッファを管理します。 std::string
。
ボイラープレートコードを避け、std::string
からstd::string
への透過的な変換を許可したいと思います。したがって、一時的なものが必要な場合など、エッジの場合にstd::string
のデータの割り当て/コピーを避けることはできますか?このことを考えてみましょう:
class A {
public:
A(const char* p) : p_{std::strdup(p)} { }
~A() { free(p_); }
A& append(const A&);
private:
char* p_;
};
を今すぐ次のコードで:
A a;
a.append("test");
一時オブジェクトが作成され、割り当て、データをコピーします。その後すぐに破壊されます。問題は、A& append(const char*)
のようなすべての関数のバージョンを作成せずにこれを避ける方法があるということです。 std::string
の透過的な変換もサポートしたいので、自動的に各機能の3つのバージョンになります。
には、以下のアプローチはどのような効果を持つことになります。
class A {
public:
A(const char* p) : p_{std::strdup(p)} { }
A(const char* p) &&
: p_{p} {
}
~A() { free(p_); }
~A() && { /* nothing */ }
A& append(const A&);
private:
char* p_;
};
これで問題が解決しない場合、どのような戦略私はこの問題を解決するために適用することができますか?
をA' 'のコピーがあるときは、UBで大きな問題を抱えています製。 – user2079303
@ user2079303これは完全な実装ではなく、私の問題を示す小さなコードです。 – Etherealone
私は 'char *'オーバーロードより優れたものは何も表示されません。それの問題は何ですか? – Quentin