私のC++プロジェクトでは、すべてchar*
をstd::string
に置き換える前に一歩前ですが、std::string
が惨めに失敗することがあります。C++の文字列が文字列リテラルのために十分に最適化されていない
は、私はこれらの2つの機能を持っている想像:私はこのような何か書く場合
void foo1(const std::string& s)
{
...
}
void foo2(const char* s)
{
...
}
は:
const char* SL = "Hello to all!";
foo1(SL); // calls malloc, memcpy, free
foo2(SL);
をfoo1
にSL
は、暗黙的にstd::string
に変換されます。これは、std::string
コンストラクタがメモリを割り当て、文字列リテラルをそのバッファにコピーすることを意味します。 foo2
では、これらのすべてが起こることはありません。
ほとんどの実装では、std::string
は超最適化されています(たとえばCopy On Write)が、const char*
で構成するとそうではありません。そして私の質問はこれです:なぜこれが起こるのですか?何か不足していますか?私の標準ライブラリは十分に最適化されていないか、何らかの理由で(これは私が気づいていない)完全に安全ではありませんか?
const char *a = "Hello World";
const char *b = new char[20];
のchar *はポインタはいつでも無効受け取ることがあります。
コピーオンライトは実際には「スーパー最適化」ではありません。私は、GCCの標準ライブラリはまだそれを使用していると信じていますが、10年前にマルチスレッドが標準となる前にそれが理にかなっていたからです。今日作られた純粋なライブラリの実装は、疫病のような牛を避けるでしょう。 – jalf
私は標準では、メンバー関数のイテレーターの無効化要件のためにCOWも許可しないと思います。 – Xeo
Afaik C++ 03はCOWを許可しています。私はC++ 11がそれを禁じていると信じています – jalf