Похоже, есть возможность для улучшения в оптимизаторе G CC.
Во второй версии мы получаем
call operator new(unsigned long)
mov QWORD PTR [r12], 0 ; [r12] is 0
mov esi, 4
mov rdi, rax
call operator delete(void*, unsigned long)
mov edi, 4
call operator new(unsigned long)
mov rdi, QWORD PTR [r12] ; rdi=[r12] == 0 (duh)
mov DWORD PTR [rax], 1111
mov QWORD PTR [r12], rax
test rdi, rdi ; unnecesary test
je .L1 ; branch always taken
mov esi, 4 ; unreachable code
call operator delete(void*, unsigned long) ;
.L1:
лязг 9 на с другой стороны, производит гораздо меньший код для второй версии, поскольку он способен исключить первую new
/ delete
.
push rbx
mov rbx, rdi
mov qword ptr [rdi], 0
mov edi, 4
call operator new(unsigned long)
mov dword ptr [rax], 1111
mov qword ptr [rbx], rax
mov rax, rbx
pop rbx
ret