6

私のプログラムには、いくつかの同一の文字列定数があります。

const char* Ok()
{
  return "Ok";  
}

int main()
{
  const char* ok = "Ok";
}

それらが同じアドレスを持っているという保証はありますか?つまり、次のコードを記述できますか? GNU C++ では文字列が同じアドレスになるように最適化されると聞きましたが、私のプログラムでその機能を使用できますか?

int main()
{
  const char* ok = "Ok";
  if ( ok == Ok() ) // is it ok?
  ;
}
4

6 に答える 6

11

確かに保証はありませんが、それは一般的な (私が思うに) 最適化です。

C++ 標準は次のように述べています (2.13.4/2 "文字列リテラル):

すべての文字列リテラルが異なる (つまり、重複しないオブジェクトに格納される) かどうかは、実装によって定義されます。

明確にするために、この最適化が行われることを前提としたコードを書くべきではありません。Chris Lutz が言うように、これに依存する C++ コードは壊れるのを待っているコードです。

于 2009-10-23T06:30:25.350 に答える
8

これは文字列インターンと呼ばれます

あなたの場合、それに頼らない方が良いです。範囲は異なりますが、私はこのテーマについてあまり有能ではありません

于 2009-10-23T06:30:26.877 に答える
3

GCC はこのような最適化を使用しており、Microsoft も使用しています (彼らはこれをstring poolingと呼んでいます)。これは単なる最適化です。C++ 標準では、それを使用できないと明示的に述べられています (2.13.4/2)。さらに、他のモジュール/ライブラリから文字列へのポインターを取得することを想像してみてください。その場合、コンパイラーはそのような最適化を行うことができないと思います。

于 2009-10-23T06:47:14.957 に答える
2

それらが同じアドレスを持っているという保証はありますか?つまり、次のコードを記述できますか?

文字列リテラルは読み取り専用であるため、標準ではこのような最適化が許可されています。

GNU C++ では文字列が同じアドレスになるように最適化されると聞きましたが、私のプログラムでその機能を使用できますか?

はい、GCC/G++ はしばしばそうします。知る限り、これをオン/オフするオプションがあります。

于 2009-10-23T06:31:10.310 に答える
2

そんな保証はありません。言語は、同じ住所を持っている可能性があると言っているだけです。または、そうではないかもしれません。

于 2009-10-23T06:36:29.830 に答える
0

実際、解決策があるので、簡単な解決策:

char const * const Message_Ok = "OK";

char const * const OK() { return Message_Ok; }

int main(int argc, const char* argv[])
{
  if (OK() == Message_Ok) { std::cout << "OK" << std::endl; }
  return 0;
}

2 つの異なる文字列リテラルを比較することはできませんが、const グローバル変数を使用して意味を伝えOK、メモリ アドレスを比較します :)

一部の extern が欠落している可能性があります...その野獣には問題があります

于 2009-10-23T12:42:09.737 に答える