0

背景

我正在开发一个语音转换器程序,它将英语文本转换为等效的区域语言文本。区域语言的字符将多于英文字母,并且区域语言字体使用字体中的几乎所有位置 (1-255)。

我的程序支持不同的字体,我创建了一个字体类,它有方法可以访问字符。这个类将有 255 个方法,每个方法代表每个字符。所有这些都被标记为虚拟,以便新字体可以覆盖必要的字符方法。

这个字体类中的方法很简单。所有方法都是单行的。例子是

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

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

..

问题

  1. 单个类中的 255 个虚函数会产生任何性能问题吗?我知道vtable的东西,但我不确定它在这种情况下有多大的影响。
  2. 任何人都可以为这门课推荐一个替代设计吗?主要设计目标是允许派生类覆盖必要的方法。我曾考虑将字符添加到地图矢量等容器中,并提供获取字符的方法。但是由于我将有 255 个项目并且经常使用这个类,所以我认为每次我必须循环容器来获取角色,这又是一个问题。

任何想法?

4

5 回答 5

2

我建议您使用非 ASCII(区域)字符的标准编码。

标准编码称为“unicode”,例如http://www.joelonsoftware.com/articles/Unicode.html

无论如何:回答你的问题......

单个类中的 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)有一个获取索引并返回对象的函数。

这种设计的一个好处是您可以使用一些相同的字形(例如,对于数字)拥有多个字符集。

说了这么多,为什么不使用 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 个字符的向量?

每个“字体”只是在数组中安装不同的字符?甚至是 Character 类?

或者你可以使用地图或其他东西

255方法绝对不是要走的路。

于 2009-01-28T02:57:54.583 回答