如何强制编译器发出虚拟化代码

时间:2017-02-09 03:58:49

标签: c++ optimization g++

考虑以下(过度简化)情况:

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中进行虚拟化的代码,或指定要测试的特殊虚函数,从而对其进行更多优化?

1 个答案:

答案 0 :(得分:0)

看起来最简单的解决方案就是

$file = $this->service->files->get('root',array( 'fields'=>'size,spaces,quotaBytesUsed',));