避免嵌入式目标上的虚拟功能

时间:2015-09-09 11:39:02

标签: c++ templates virtual

我有一个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(..)等。

这是尖叫的“模板” - 但我该怎么做?

谢谢!

1 个答案:

答案 0 :(得分:2)

调用虚函数与​​静态函数的成本最差的是单个查找。

每个对象都有一个指向它的vtable的指针,其中包含虚函数指针,所以它类似于:

ldr [r0,#8],r4 
blx r4

而不是

ldr #0x400025e5,r4
blx r4

或(如果您需要分支的地址可以内联编码)

br #0x1035

只要您没有在紧密循环中调用虚函数,它就不是问题。