相关疑难解决方法(0)

C++编译器可以在同一个指针上优化重复的虚函数调用吗?

假设我有以下代码

void f(PolymorphicType *p)
{
    for (int i = 0; i < 1000; ++i)
    {
        p->virtualMethod(something);
    }
}
Run Code Online (Sandbox Code Playgroud)

编译器生成的代码解除引用pvtable条目是virtualMethod1次还是1000次?我正在使用Microsoft的编译器.

编辑

这是我正在查看的真实世界案例的生成程序集. line->addPoint()是虚拟的关注方法.我没有装配经验,所以我慢慢地过去了...

; 369  :        for (int i = 0; i < numPts; ++i)

    test    ebx, ebx
    je  SHORT $LN1@RDS_SCANNE
    lea edi, DWORD PTR [ecx+32]
    npad    2
$LL3@RDS_SCANNE:

; 370  :        {
; 371  :            double *pts = pPoints[i].SystemXYZ;
; 372  :            line->addPoint(pts[0], pts[1], pts[2]);

    fld QWORD PTR [edi+8]
    mov eax, DWORD PTR …
Run Code Online (Sandbox Code Playgroud)

c++ polymorphism performance vtable

15
推荐指数
1
解决办法
1294
查看次数

如何获得指向虚拟成员函数的“直接”函数指针?

我正在一个嵌入式平台上工作,它不能很好地处理动态代码(根本没有推测/OOO 执行)。在这个平台上,我经常在同一个对象上调用虚拟成员函数,但是编译器无法优化 vtable-lookup,因为它似乎没有识别出仅在第一次调用时才需要查找。

因此我想知道:是否有一种手动方法可以对 C++ 类的虚拟成员函数进行去虚拟化,以获得直接指向解析地址的函数指针?我查看了 C++ 函数指针,但由于它们似乎需要指定类型,我想这行不通。

先感谢您

c++ pointers

5
推荐指数
1
解决办法
1328
查看次数

模板作为C++中虚函数的替代

我在基类中定义了一个昂贵的函数,它依赖于派生类的低级信息:

class BaseClass{
 ...
 // Defined in derived class
 virtual int low_level(int)=0;

 // Expensive function depending on the pure virtual function
 void myExpensiveFunction(){
   for(...){
     for(...){
       for(...){
         ... = low_level(...);
         ...
       }
     }
   }
 }
};

class DerivedClass : public BaseClass{
   // A very cheap operation that can be inlined:
   inline virtual int low_level(int i){
     return a[i];
   }

   // Calling the base class function
   void test(){
     myExpensiveFunction();
   }
};
Run Code Online (Sandbox Code Playgroud)

如果我理解正确,那么低级函数是虚拟的这一事实可以防止它在上面的代码中被内联.现在,我正在考虑一种解决此问题的方法并考虑以下解决方案,其中我将指向派生类成员函数的指针作为模板参数传递:

class BaseClass{
 ...
 // The function is now templated by the …
Run Code Online (Sandbox Code Playgroud)

c++

1
推荐指数
1
解决办法
1443
查看次数

标签 统计

c++ ×3

performance ×1

pointers ×1

polymorphism ×1

vtable ×1