0

バックグラウンド

私は英語のテキストを同等の地域の言語のテキストに変換する音声変換プログラムに取り組んでいます。地域の言語は英語の文字よりも多くの文字を持ち、地域の言語のフォントはフォント内のほぼすべての位置(1〜255)を使用します。

私のプログラムはさまざまなフォントをサポートしており、文字にアクセスできるメソッドを持つフォントクラスを作成しました。このクラスには、それぞれが各文字を表す255個のメソッドがあります。新しいフォントが必要な文字メソッドをオーバーライドできるように、これらはすべて仮想としてマークされています。

このフォントクラスのメソッドは簡単です。すべてのメソッドは1行です。例は

string StandardFont::consonant1(){
    return "a";
}

string StandardFont::consonant2(){
    return "b";
}

..

質問

  1. 1つのクラスに255個の仮想関数があると、パフォーマンスの問題が発生しますか?vtableに関することは知っていますが、このシナリオでどの程度の影響があるかはわかりません。
  2. 誰かがこのクラスの代替デザインを提案できますか?主な設計目標は、派生クラスが必要なメソッドをオーバーライドできるようにすることです。マップベクトルなどのコンテナに文字を追加し、文字を取得するメソッドを提供することを考えました。しかし、255個のアイテムがあり、このクラスは頻繁に使用されるため、キャラクターを取得するためにコンテナーをループする必要があるたびに、これも問題になると思います。

何か考えはありますか?

4

5 に答える 5

2

非ASCII(地域)文字の標準エンコーディングを使用することをお勧めします。

標準のエンコーディングは「unicode」と呼ばれます。たとえば、http://www.joelonsoftware.com/articles/Unicode.html

とにかく:あなたの質問に答えるために..。

1つのクラスに255個の仮想関数があると、パフォーマンスの問題が発生しますか?

一言で言えば:いいえ、そうではありません。

しかし、255個のアイテムがあり、このクラスは頻繁に使用されるため、キャラクターを取得するためにコンテナーをループする必要があるたびに、これも問題になると思います。

長さが256のベクトルまたは固定長配列を使用すると、ループする必要はありません...代わりに、直接インデックスを作成できます。次に例を示します。

const char* translations[256] = {
 "a",
 "bee",
 "c!",
 ...etc...
};

const char* translate(char c)
{
  //use the character as an index into the array
  int index = c;
  //use the translation array (using indexing, not looping)
  const char* result = translations[index];
  return result;
}
于 2009-01-28T02:22:48.880 に答える
2

255の仮想関数は、通常、パフォーマンスの問題を引き起こしません(ただし、クラスの各インスタンスには、キャッシュにごくわずかな影響を与える大きなVTableがあります)。

ただし、255の仮想関数は、通常、メンテナンスの悪夢を引き起こします。

私があなたの説明を正しく理解しているなら、あなたが必要とするのは:

1)地域の言語で文字を表すクラスを作成します。おそらく、画像や必要なものを返すメソッドを使用します。

2)Createは、文字セットを表すクラスの階層です。

3)文字セットのすべてのインスタンスは、位置から文字クラスのインスタンスへのマッピングを維持します。

4)インデックスを取得してオブジェクトを返す関数を用意します。

このデザインの利点の1つは、同じグリフのいくつかを使用して複数の文字セットを使用できることです(たとえば、数字の場合)。

そうは言っても、なぜUnicodeと16ビット文字を使用しないのですか?

于 2009-01-28T02:23:46.430 に答える
0

255のメソッドではなく、単一のメソッドを使用して文字にアクセスする方がクリーンだと思います。索引付け/添字が頭に浮かびます。

これらのクラスがどのように使用されるかを明確にしていただけますか?言語とアルファベットが違うので、同じように複数の文字を参照するのは不思議に思えます。文字は、あらゆる観点から、恣意的です。それらは異なる言語では異なり、無関係になります。

Unicodeの目標は、問題の解決策を提供することです。使用を検討しましたか?

于 2009-01-28T02:25:58.157 に答える
0

速度の問題に対処すると、255 個の仮想メソッドを使用しても特定のパフォーマンスが低下することはありませんが、通常のアドバイスが適用されます。どのように実行されるかわからない場合、それを確認する唯一の方法はそれをベンチマークすることです。

そうは言っても、問題にアプローチするためのより良い方法がある可能性は非常に高いです。このフォント クラスが何をすべきかについて詳細を提供していただけると助かります。

于 2009-01-28T02:26:35.660 に答える
0

なぜ255文字のベクトルを持たないのですか?

各「フォント」は、配列に異なる文字をインストールするだけですか? それともキャラクタークラス?

または、マップなどを使用できます

255 のメソッドは、間違いなく進むべき道ではありません。

于 2009-01-28T02:57:54.583 に答える