c++ - GCC 和去虚拟化内联

标签 c++ gcc

为什么在下面的代码中,知道确切类型的编译器不能内联虚函数?

https://goo.gl/AgvefX

using namespace std;

struct Base{
    void fire(){
        show();
    }

    virtual void show() =0;/*{
        cout << "base";
    }*/
};

struct A : Base{
    inline __attribute__((__always_inline__)) void show() {
        cout << "a";
    }
};

int main() {
    A a;
  for (int i=0;i<1000;i++){
    a.fire();
  }
    //a.fire();

    return 0;
}

如果没有 CRTP,我能做点什么吗?

最佳答案

我不擅长阅读汇编代码,但我在 main 中看到您的示例的方式:

  1. 1000 被加载到一个寄存器中
  2. 减去1,
  3. 载入“a”的地址
  4. 输出运算符在
  5. 之前被调用
  6. 跳回到循环的开头。

我没有看到对 fireshow 的调用。它保留显示的实现,但未使用。这是正确的,因为它有外部链接。

如果将所有内容都放在匿名命名空间中,则可以省略实现。

您能否在您的问题中使用汇编代码进行推理?作为引用,这里是从提供的链接生成的汇编代码:

.LC0:
    .string "a"
A::show():
    movl    $1, %edx
    movl    $.LC0, %esi
    movl    std::cout, %edi
    jmp std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, long)
main:
    pushq   %rbx
    movl    $1000, %ebx
.L3:
    movl    $1, %edx
    movl    $.LC0, %esi
    movl    std::cout, %edi
    call    std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, long)
    subl    $1, %ebx
    jne .L3
    xorl    %eax, %eax
    popq    %rbx
    ret
    subq    $8, %rsp
    movl    std::__ioinit, %edi
    call    std::ios_base::Init::Init()
    movl    $__dso_handle, %edx
    movl    std::__ioinit, %esi
    movl    std::ios_base::Init::~Init(), %edi
    addq    $8, %rsp
    jmp __cxa_atexit

关于c++ - GCC 和去虚拟化内联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32789374/

相关文章:

c - 为什么 gcc 将错误消息分成几行?

c - 为什么 gcc 允许向长度为 2 的 char 数组输入两个以上的字符?

c++ - 一个 'friend of a Class' 的函数允许 'read access' 到它的 'private members' 但不是 'write access' ?

c++ - 在 C++ 元编程中是否全部使用模板?

c - 在不同发行版上执行 AppImage 时找不到 GLIBC 版本

c - 为什么 fork 会减慢我的应用程序

c++ - Eclipse CDT Indigo CLOCKS_PER_SEC 无法解决问题

c++ - 下面代码中指针的使用

c++ - c++ std 的 inf 是否表现得与常识性无穷大一样

c - GCC 中该表达式中的值是如何计算的