【问题标题】:Class design suggestions - C++类设计建议 - C++
【发布时间】:2009-01-28 02:18:08
【问题描述】:

背景

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

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

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

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

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

..

问题

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

有什么想法吗?

【问题讨论】:

  • 你能详细说明一下吗?这 255 种方法实际上会做什么?什么代码会调用它们?

标签: c++ virtual-functions


【解决方案1】:

我建议您使用非 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;
}

【讨论】:

  • 谢谢克里斯。我也有unicode。但是这个库预计可以使用 ASCII 字体。
  • 顺便说一句,你认为我可以在这里使用静态多态性(使用模板)吗?
  • 回复。使用模板:你能举一个你在想什么的例子吗?你可能会,但我目前不明白你为什么会这样做,也不知道为什么会这样做:因为某处/某时你仍然需要翻译变量、运行时数据。
  • 你是对的。我不能考虑在这里安装模板。无论如何感谢您的时间。非常感谢。
【解决方案2】:

255 个虚函数通常不会导致性能问题(除非您的类的每个实例都有一个很大的 VTable,这会非常轻微地影响缓存)。

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

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

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

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

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

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

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

说了这么多,为什么不使用 Unicode 和 16 位字符?

【讨论】:

  • 感谢您的建议。我也有unicode。但是这个库预计可以使用 ASCII 字符。
  • 你的理解几乎是正确的。但是第 1 点和第 2 点是结合在一起的。一个类代表特定字体的所有字符。
  • 否 - 每个类都有一个大 VTable,每个实例只使用一个 VTable 指针,该指针指向给定类的公共 VTable。
  • 对不起,我的意思是类的每个子类,而不是类的每个实例。对缓存的影响是可能的,但不太可能。
【解决方案3】:

我认为使用单一方法而不是 255 方法来访问字符会更简洁。想到索引/下标。

您能否说明如何使用这些类?由于语言和字母不同,我觉得你会以相同的方式引用多个字母感到很奇怪。从各个角度来看,字母都是任意的。它们在不同的语言中会有所不同且不相关。

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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

      为什么不只包含 255 个字符的向量?

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

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

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

      【讨论】:

      • 我想到了。但我不确定它是否比虚拟功能更高效。我知道维护 255 个函数很痛苦。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-19
      • 1970-01-01
      • 2012-10-31
      • 2011-10-23
      相关资源
      最近更新 更多