21

std::string割り当てられたメモリをから盗むことができる場合、のsubstr操作は右辺値に対してはるかに効率的である可能性があることに気づきました*this

N3225の標準ライブラリには、次のメンバー関数宣言が含まれています。std::string

basic_string substr(size_type pos = 0, size_type n = npos) const;

右辺値用に最適化されたものを実装できる実装は、substrそれをオーバーロードし、2つのバージョンを提供できますか?そのうちの1つは右辺値文字列のバッファーを再利用できますか?

basic_string substr(size_type pos = 0) &&;
basic_string substr(size_type pos, size_type n) const;

*this設定のメモリを移動元の状態に再利用して、右辺値バージョンを次のように実装できると思います*this

basic_string substr(size_type pos = 0) && {
  basic_string __r;
  __r.__internal_share_buf(pos, __start + pos, __size - pos);
  __start = 0; // or whatever the 'empty' state is
  return __r;
}

これは一般的な文字列の実装で効率的に機能しますか、それともハウスキーピングが多すぎますか?

4

3 に答える 3

4

まず、実装はソースを盗むオーバーロードを追加できません。これは検出可能であるためです。

std::string s="some random string";
std::string s2=std::move(s).substr(5,5);
assert(s=="some random string"); 
assert(s2=="rando");

実装がからデータを盗んだ場合、最初のアサートは失敗しs、C++0xの文言は本質的に書き込み時のコピーを禁止します。

第二に、これはとにかく最適化である必要はありません。std::stringそれがより大きな文字列のサブ文字列である場合を処理するために追加のハウスキーピングを追加する必要があります。つまり、参照する文字列がなくなったときに大きなブロックを保持することを意味します。大きな文字列、その一部の部分文字列。

于 2011-02-17T16:48:56.917 に答える
0

はい、そして多分それは標準化委員会に提案されるべきであるか、あるいは多分図書館で実行されるべきです。最適化がどれほど価値があるのか​​、私にはよくわかりません。そして、それだけでも興味深い研究になるでしょう。

gccがr値のサポートを拡大するときthis、誰かがそれを試して、それがどれほど有用であるかを報告する必要があります。

于 2011-02-17T17:07:35.110 に答える
-2

コピーオンライトを実装する文字列クラスがいくつかあります。ただし、本当に正当な理由がない限り、プロジェクトにさらに別の文字列タイプを追加することはお勧めしません。

メモリ効率の高いC++文字列(インターン、ロープ、コピーオンライトなど)の説明を確認してください。

于 2011-02-17T13:07:39.193 に答える