Why isn't this unused variable optimised away?

后端 未结 4 1637
情深已故
情深已故 2021-02-06 21:47

I played around with Godbolt\'s CompilerExplorer. I wanted to see how good certain optimizations are. My minimum working example is:

#include 

int         


        
4条回答
  •  囚心锁ツ
    2021-02-06 22:16

    std::vector is a fairly complicated class that involves dynamic allocation. While clang++ is sometimes able to elide heap allocations, it is a fairly tricky optimization and you should not rely on it. Example:

    int foo() {
        int* p = new int{5};
        return *p;
    }
    
    foo():                                # @foo()
            mov     eax, 5
            ret
    

    As an example, using std::array (which does not dynamically allocate) produces fully-inlined code:

    #include 
    
    int foo() {
        std::array v{1, 2, 3, 4, 5};
        return v[4];
    }
    
    foo():                                # @foo()
            mov     eax, 5
            ret
    

    As Marc Glisse noted in the other answer's comments, this is what the Standard says in [expr.new] #10:

    An implementation is allowed to omit a call to a replaceable global allocation function ([new.delete.single], [new.delete.array]). When it does so, the storage is instead provided by the implementation or provided by extending the allocation of another new-expression. The implementation may extend the allocation of a new-expression e1 to provide storage for a new-expression e2 if the following would be true were the allocation not extended: [...]

提交回复
热议问题