只是想知道,什么会是最快的?如果我有一个像这样的基类
Class Base
{
virtual void Draw()
{
//something...
}
};然后我会有一个Base数组,如下所示:
Base Array[255];它可以同时包含Base和它的衍生物。例如,这将是存储各种绘图命令的一种方式。(我知道这看起来很像java,但这只是示例。只有一个函数的类没有多大意义。)
现在或者,如果我确切知道我会做什么导数,它可以这样做
class Base
{
int ID;
};然后是一个和以前一样的基数组:基数组Array255;
然后在导数中创建绘图函数:
class Der1 : Base
{
void Draw()
{
}
};
class Der2 : Base
{
void Draw()
{
}
};现在,这个解决方案当然不允许我在数组中循环,并为每个对象调用Draw。相反,它必须像这样做。
void CallDraw()
{
for (int i = 0; i < 255; i++)
{
switch(Array[i].ID)
{
case 1: //Der1
( (Der1) Array[i] ) . Draw();
case 2: //Der2
( (Der2) Array[i] ) . Draw();
}是的,对于那些到目前为止已经读过的人来说,真正的问题。如果你知道导数,哪一个会更快?自己做一个有组织的系统,还是使用虚拟函数?
还有其他需要考虑的事情吗?(代码可能是干净的,但我更喜欢在代码中展示我的类类型,所以我不会被强制转换所困扰。
发布于 2010-07-31 07:36:59
一定要使用虚函数,这正是它们的作用所在。自己重新实现它很容易出错,而且肯定不会更快。
此外,在Array的声明中,您需要使用指针:
Base *Array[255];否则,在C++ (不同于Java)中,数组只能包含Base的实例,而不能包含派生类的对象。使用指针更像是Java的引用,允许您将派生类的实例放入数组中。
发布于 2010-07-31 07:39:35
使用虚函数,因为从逻辑上讲,它们的工作方式几乎相同,但使用虚函数表查找可能会更慢/更快(取决于实现)。不过,除非这是代码的关键部分(也就是99 / 100的情况),否则不要为这类事情烦恼。
使用虚函数可以使您的代码更简洁、更简洁,而且您不必为您自己的C++实现相关问题而烦恼。
发布于 2010-07-31 07:39:39
我假设您是出于好奇心才问这个问题的--并不是因为您实际上会尝试用一个开关来实现它。
您必须将阵列设置为Base*,而不是Base
虚拟调用是数组查找和函数调用。开关通常被实现为简单的恒定时间跳跃。所以,它们都是O(1),但我认为虚拟调用会更快,因为C++编译器将进行优化,以使其更快,并且开关不能保证为O(1)。
https://stackoverflow.com/questions/3376086
复制相似问题