有没有办法解决虚函数的效率问题?
我用通过虚函数的方式写了个dll(如某类A),只在调用的时候通过基类指针绑定这个dll中的类A。由于程序仅通过一次绑定,所以我想问下有没有什么方法使得这个基类指针能不通过虚函数表直接调用类的接口?
[解决办法]
如果你确定只有A一种实现,那么你大可不用虚函数,直接导出基类。否则,要多态就必然付出代价。况且动态跳转这点代价也没必要那么在意了...
[解决办法]
如果不到万不得以,就别用多态了。想要用多态,那么你就得付出点代价。
[解决办法]
可以考虑用模板来解决,将虚函数的运行时多态迁移到编译期,运行效率自然会高一些
[解决办法]
可以使用模板的静态多态,WTL里就是这样用的,比如
template <class T>class B1{public: void SayHi() { T* pT = static_cast<T*>(this); // HUH?? 我将在下面解释 pT->PrintClassName(); }protected: void PrintClassName() { cout << "This is B1"; }}; class D1 : public B1<D1>{ // No overridden functions at all}; class D2 : public B1<D2>{protected: void PrintClassName() { cout << "This is D2"; }}; main(){ D1 d1; D2 d2; d1.SayHi(); // prints "This is B1" d2.SayHi(); // prints "This is D2"}
[解决办法]
C++的虚函数慢也是相对的,也就是函数调用开销稍大,如果你虚函数的函数体本身开销远远高于调用开销,根本不用在乎,正如绝大多数函数用inline无法获得性能明显提升一样
不推荐用模版原因如下
1.从工程管理和代码一致性角度考虑,毕竟模版的代码风格与C++其他部分差别过大,所以我一旦用模版,必然是全工程普遍使用,让整个工程都变成模版风格(STL容易除外,因为太好用了,但我在不用自定义模版的工程中使用SQL也会尽量用下标等接近于C的使用方式)
2.从效率考虑,模版只是理论上比虚函数性能高,而事实是,现代化计算机各级存储器之间速度差距越来越大,缓存命中率对性能的影响很多时候远远高于多几条指令。所以工程实践中有时出现如下反常情况:计算法比查表法快,循环不展开比展开快……总之共同点就是小代码比大代码快