类设计建议 - C ++

时间:2009-01-28 02:18:09

标签: c++ virtual-functions

背景

我正在制作一个语音转换程序,将英文文本转换为等效的区域语言文本。区域语言将包含比英文字母更多的字符,区域语言字体几乎使用字体中的所有位置(1-255)。

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

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

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

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

..

问题

  1. 单个类中的255个虚拟函数会产生任何性能问题吗?我知道 vtable 的东西,但我不确定它在这种情况下会产生多大的影响。
  2. 有人可以为这个班级建议一个替代设计吗?主要设计目标是允许派生类覆盖必要的方法。我曾想过将字符添加到 map vector 等容器中,并提供获取字符的方法。但是因为我将有255个项目并且经常使用这个类,我想每次我必须循环容器来获取角色,这也是一个问题。
  3. 有什么想法吗?

5 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:2)

255个虚函数一般不会导致性能问题(除了你的类的每个实例都有一个很大的VTable,它会对缓存产生很小的影响)。

然而,255个虚拟功能通常会导致维护噩梦。

如果我理解你的描述正确,那么你需要的是:

1)创建一个用区域语言表示字符的类,可能有返回图像的方法或任何你需要的方法。

2)Create是表示字符集的类的层次结构。

3)字符集的每个实例都将保持从位置到字符类实例的映射。

4)有一个获取索引并返回对象的函数。

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

所有这些,你为什么不使用Unicode和16位字符?

答案 2 :(得分:0)

我认为使用单个方法来访问字符而不是255个方法会更清晰。想到了索引/下标。

您能澄清一下如何使用这些课程吗?由于语言和字母不同,我觉得你会以同样的方式引用多个字母。从各个角度来看,信件是任意的。它们将在不同语言中不同且无关。

Unicode的目标是为您的问题提供解决方案。你考虑过使用它吗?

答案 3 :(得分:0)

解决你的速度问题,拥有255种虚拟方法不应该导致任何特定的性能损失,尽管通常的建议适用:如果你不确定它将如何执行,唯一的方法是找出基准它

话虽如此,很可能有更好的方法来解决问题。如果您提供有关此字体类应该执行的操作的更多详细信息,将会有所帮助。

答案 4 :(得分:0)

为什么不只有255个字符的矢量?

每个“font”只是在数组中安装不同的字符?甚至是一个角色类?

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

255方法绝对不是可行的方法。