[cfe-dev] missing optimization opportunity for const std::vector compared to std::array

Dennis Luehring via cfe-dev cfe-dev at lists.llvm.org
Sat Oct 20 03:00:45 PDT 2018


for gcc-discussion see: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=58483

is there a (good) reason not to remove the new/delete combination when 
the result is already known?

#include <vector>
#include <numeric>
#include <array>

static int calc(const std::array<int,3> p_ints, const int& p_init)
//static int calc(const std::vector<int> p_ints, const int& p_init)
{
   return std::accumulate(p_ints.begin(), p_ints.end(), p_init);
}

int main()
{
   const int result = calc({10,20,30},100);
   return result;
}

results:

gcc.godbolt x86-64 clang trunk, with -O2

with std::array

main: # @main
mov eax, 160
ret

with std::vector

main: # @main
push    rax
mov     edi, 12
call    operator new(unsigned long)
movabs  rcx, 85899345930
mov     qword ptr [rax], rcx
mov     dword ptr [rax + 8], 30
mov     rdi, rax
call    operator delete(void*)
mov     eax, 160
pop     rcx
ret

---

clang reduces new/delete with std::string but vector seems to be missing 
(buildin_new/delete missing in libc++?)

#include <string>

int main()
{
   return std::string("hello").size();
}

down to

main: # @main
mov eax, 5
ret




More information about the cfe-dev mailing list