lang去虚拟化和分配优化

时间:2019-07-02 15:52:59

标签: c++ compiler-optimization clang++

我正在玩一个简单的代码,试图了解如何使编译器优化分配和虚拟调用。我用c。我有以下代码:

    // external functions
    int acquire();
    int do_something(int id);

    namespace {

    struct bar {
        virtual int exec() = 0;
    };

    struct poof: bar {
        poof() {
            //id = acquire();
        }

        virtual int exec() {
            return do_something(id);
        }

        int id = 0;
    };

    struct foo {
        bar *b;
        int operator()() {
            return b->exec();
        }
    };

    }

    int main() {
        foo e{new poof};
        return e();
    }

When compiling with clang-trunk and -O3我得到了以下经过优化的程序集:

    main:                                   # @main
            xor     edi, edi
            jmp     do_something(int)       # TAILCALL

现在,取消注释行id = acquire();的注释,我希望xor edi,edicall acquire(); mov edi, rax之类的东西代替。相反,我看到编译器突然无法再优化动态分配和虚拟调用。

原因是什么,如何使编译器对其进行优化?

0 个答案:

没有答案