背景
我正在制作一个语音转换程序,将英文文本转换为等效的区域语言文本。区域语言将包含比英文字母更多的字符,区域语言字体几乎使用字体中的所有位置(1-255)。
我的程序支持不同的字体,我创建了一个字体类,它有方法可以访问字符。该类将有255个方法,每个方法代表每个字符。所有这些都标记为虚拟,以便新字体可以覆盖必要的字符方法。
此字体类中的方法很简单。所有方法都是单行。例子是
string StandardFont::consonant1(){
return "a";
}
string StandardFont::consonant2(){
return "b";
}
..
问题
有什么想法吗?
答案 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方法绝对不是可行的方法。