假设我有以下代码
void f(PolymorphicType *p)
{
for (int i = 0; i < 1000; ++i)
{
p->virtualMethod(something);
}
}
Run Code Online (Sandbox Code Playgroud)
编译器生成的代码解除引用p的vtable条目是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) 我正在一个嵌入式平台上工作,它不能很好地处理动态代码(根本没有推测/OOO 执行)。在这个平台上,我经常在同一个对象上调用虚拟成员函数,但是编译器无法优化 vtable-lookup,因为它似乎没有识别出仅在第一次调用时才需要查找。
因此我想知道:是否有一种手动方法可以对 C++ 类的虚拟成员函数进行去虚拟化,以获得直接指向解析地址的函数指针?我查看了 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)