2

これは、のconstコピーの処理におけるSTL実装間の違いについての質問ですstd::string。私はそのような短いテストを持っています、それは2つのconstコピーをして、そしてによって返されたアドレスを印刷しますc_str()

#include <stdio.h>
#include <string>
using namespace std;
int main()
{
          string a("Hello World!");
    const string b(a);
    const string c(b);

    printf("a: %p = %s\n", a.c_str(), a.c_str());
    printf("b: %p = %s\n", b.c_str(), b.c_str());
    printf("c: %p = %s\n", c.c_str(), c.c_str());
  return c.c_str() == b.c_str();
}

libstdc++。so.6.0.16STLを使用するgcc4.6.2では、すべてのポインターが等しいものとして返されます。

この動作に頼ることはできますか?

ポータブルですか、それとも最近の規格で定義されていますか?

これは、libstdc ++、libc ++、Microsoft STL、stdcxx(apache.org)の現在または将来のバージョンで機能しますか?

4

2 に答える 2

10

これは、 COW (Copy on Write)セマンティクスとして知られているものです。文字列の不必要なコピーを避けるための最適化戦略です。ただし、この動作に依存することはできません。これは GNU libstdc++ の実装の詳細です。実際、C++11 標準では許可されていません。

于 2012-12-10T17:19:13.130 に答える
3

その振る舞いにまったく頼ることはできません。保証されている唯一のことc_str()は、返されたポインターが基になるものが変更されるまで有効であることですstring(特定のメソッド/機能が返されたポインターを無効にします)。特定のアーキテクチャまたはコンパイラで動作するという保証はなく、そのような動作に依存するべきではありません。

于 2012-12-10T18:25:31.987 に答える