c++ - 调用常量指向成员函数的指针未被内联

标签 c++ c++11

现在,我知道没有内联保证,但是......

鉴于以下情况:

struct Base {
    virtual int f() = 0;
};

struct Derived : public Base {
    virtual int f() final override {
        return 42;
    }
};

extern Base* b;

我们有:

int main() {
    return static_cast<Derived*>(b)->f();
}

编译为:

main:
    movl    $42, %eax
    ret

然而...

int main() {
    return (static_cast<Derived*>(b)->*(&Derived::f))();
}

编译为:

main:
    pushl   %ebp
    movl    %esp, %ebp
    andl    $-16, %esp
    subl    $16, %esp
    movl    b, %eax
    movl    (%eax), %edx
    movl    %eax, (%esp)
    call    *(%edx)
    leave
    ret

这真是令人难过。

为什么没有内联对 PMF 的调用? PMF 是一个常量表达式!

最佳答案

这里的问题是,在第一种情况下,基于类型的去虚拟化将间接调用变成了直接调用。 当你添加一个成员指针时,不能使用基于类型的去虚拟化(因为它通过前端传递给关于类型和被调用的虚拟方法的优化信息来工作,在这种情况下,这些信息不是很容易知道的)。 GCC 通过知道 B 是一个类并且知道它的成员只能被调用,可能能够不断地将实际访问折叠到 virtual table 中建成后。目前它不做这样的分析。

我建议填写GCC bugzilla 的增强请求。

关于c++ - 调用常量指向成员函数的指针未被内联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19079741/

相关文章:

c++ - 将 double 转换为 struct tm

c++ - boost :为什么 write_json 改变内容

c++ - std::cin输入带有空格?

c++ - QT线型组合框

c++ - 分配给转换运算符失败 - C++

c++ - 虚函数可以被非虚函数覆盖吗?

c++ - 了解左值/右值表达式与对象类型

C++11 无法移动内部有 unordered_map 的类

c++ - constexpr 在变量声明中的位置

c++11 - 如何使用右值调用复制构造函数