私は現在Cでパーサーを書いていますが、それを設計するときに必要なものの1つは、可変文字列「クラス」(インスタンスを表す不透明な構造体を操作する関数のセット)でしたmy_string
。char *
文字列クラスのインスタンスは、いくつかのメタデータとともに、をラップする構造体にすぎません。
ただし、定数文字列では問題が発生します。たとえば、my_string *
ポインタを返すメソッドがいくつかありますが、定数文字列を返したい場合があります。この不自然な擬似コードを考えてみましょう。
my_string *element_get_data(my_element *el)
{
if (element_has_character_data(el))
return element_get_character_data(el); /* returns a (my_string *) */
else
return my_string_constant("#data"); /* ditto */
}
…場合によっては、ビルド済みのインスタンスをフェッチしたい場合もあれば、構造体my_string
にラップされた文字列「#data」を返したい場合もありますmy_string
。
このコードの問題は、が呼び出されるmy_string
たびに新しい(ヒープに割り当てられた)インスタンスが作成されることです。element_get_data(...)
C定数文字列は、プログラムのDATAセクションに静的に割り当てられるという点で優れたセマンティクスを備えているため、定数文字列が検出されるたびに、その文字列のアドレスは常に同じになります。
したがって、いくつかの異なるmy_string
インスタンスがすべてまったく同じを指しているのはばかげているようchar *
です。これを重複排除する効率的な方法は何ですか?const char * -> my_string *
マッピングのハッシュテーブルを保持する必要がありますか?または、C定数文字列と同様のセマンティクスを使用する方法はありますか?Macでは、CoreFoundationはCFSTR(...)
マクロを使用してこれを実行できます。
私にとって理想的な解決策my_string_constant(...)
は、プログラムのDATAセクションに構造体を格納するようなマクロを作成するmy_string
ことです。これも一定である可能性があります。そのようなことは可能ですか?