12

intern()Java にあるような C または C++ のメソッドのようなものはありますか? そうでない場合、C または C++ で文字列インターンを実行するにはどうすればよいですか?

4

3 に答える 3

20

boost::flyweight< std::string >まさにあなたが探しているもののようです。

于 2012-05-17T11:50:39.250 に答える
6

Java にあるような C の intern() メソッドのようなものはありますか?

標準 C ライブラリにはありません。

ない場合、C で文字列インターンを実行する方法は?

非常に困難で、私は恐れています。最初の問題は、「文字列」が C では明確に定義されていないことです。代わりにchar *、ゼロで終わる文字列を指すか、単に文字位置を示す可能性がある があります。次に、一部の文字列が他のものに埋め込まれているか、スタックに格納されているという問題があります。どちらもインターンを不可能にし、無意味にします。次に、C文字列リテラルがインターンされることが保証されていないという問題があります... Javaが保証する方法では。最後に、言語がガベージ コレクションされていない場合、interning が発生するのを待っているストレージ リークであるという問題があります。

そうは言っても、Cでインターンを実装する(しようとする)方法は、インターンされた文字列を保持するハッシュテーブルを作成することです。文字列がリテラルまたは独自のヒープノードに割り当てられた文字列でない限り、文字列をインターンできないという前提条件にする必要があります。ストレージ リークの問題に対処するには、インターンされた文字列をいつ破棄できるかを検出するために、文字列ごとの参照カウントが必要です。

于 2012-05-17T12:18:33.703 に答える
2

値のセマンティクスを持つ言語では、文字列のインターンは何を意味しますか? Interning は、値 ID を持つ文字列への参照に対してオブジェクト ID を強制するメカニズムです。これは、参照セマンティクスを使用し、オブジェクト ID をデフォルトの比較関数として使用する言語に関連しています。C++ は既定で値のセマンティクスを使用し、型のようなものstd::stringは ID を持たないため、interning は意味がありません。

一部の実装 (g++ など) は、文字列データの参照セマンティクスの形式を舞台裏で使用する場合があります。このような実装は 、拡張機能として、そのデータのある種のインターンを提供できます。(私の知る限り、G++ はそうではありませんが、空の文字列を自動的に「インターン」します。)

他のほとんどの実装では、内部で参照セマンティクスを使用することさえありません。小さな文字列の最適化 (MS など) を使用して実装をどのようにインターンしますか? 場合によっては、データが文字通りクラス内にあり、動的に割り当てられたメモリがありません。

于 2012-05-17T13:02:53.130 に答える