考虑以下(过度简化)情况:
class Base
是一个基类,具有纯虚函数,没有虚拟析构函数(因为它的预期用途不需要)。
struct A
是函数指针的包装器,即
struct A {
std::string ...;
ret_t (*f)(base&);
bool ...;
/* ... */
};
ret_t f1(base&); // there are corresponding functions
ret_t f2(base&);
ret_t f3(base&);
其中ret_t
是某种任意类型。
还有一些功能的签名就像ret_t call(A a)
。例如:
ret_t call(A a){
derived d;
return a.f(d);
}
其中derived
派生自base
,并且基数有多个派生类。
到目前为止,非常好。
但是,由于通过函数指针调用a.f
,因此无法对基本虚函数的调用进行虚拟化。 那就是说,派生类是在编译时在函数call
中确定的,因此最终可以在理论上进行去环化。
除此之外,我非常确定,在运行时,只会广泛使用一个派生类,而其他类不太可能被调用。我已经看到,如果只有一个派生类,g ++会生成在函数指针上执行cmp
的代码。
如何告诉g ++发出在最终函数f1, f2, f3
中进行虚拟化的代码,或指定要测试的特殊虚函数,从而对其进行更多优化?
答案 0 :(得分:0)
看起来最简单的解决方案就是
$file = $this->service->files->get('root',array( 'fields'=>'size,spaces,quotaBytesUsed',));