我有一个class Player
,可以播放来自大块内存的数据,这些内存包含许多相同的块。
typedef char chunk_t[100];
typedef struct {
chunk_t data[100]
} blockOfMemory_t;
播放器本身理论上可以用于不同的布局和数据内容,因此我想以可重用的方式对其进行编程。为此,我想到了这样的事情:
class Player {
public:
Player() { ... }
virtual ~Player() { ... }
void play()
{
for (int i = 0; i < getNumChunks(); i++)
{
if (chunkHasX(i) || chunkHasY(i))
playChunk(i);
}
}
protected:
virtual int getNumChunks() = 0;
virtual bool chunkHasX(int chunkIndex) = 0;
virtual bool chunkHasY(int chunkIndex) = 0;
virtual void playChunk(int chunkIndex) = 0;
}
通过继承并实现孩子的数据细节,我可以实现可重用性。
然而,目标是ARM Cortex-M4处理器,速度非常重要。出于这个原因,我希望在使用虚拟功能时会有性能上的缺陷。所以我正在寻找一种方法来实现相同类型的可重用性,可以在编译时解决,并允许内联chunkHasX(..)
等。
这是尖叫的“模板” - 但我该怎么做?
谢谢!
答案 0 :(得分:2)
调用虚函数与静态函数的成本最差的是单个查找。
每个对象都有一个指向它的vtable的指针,其中包含虚函数指针,所以它类似于:
ldr [r0,#8],r4
blx r4
而不是
ldr #0x400025e5,r4
blx r4
或(如果您需要分支的地址可以内联编码)
br #0x1035
只要您没有在紧密循环中调用虚函数,它就不是问题。